【问题标题】:Visual Studio 2017 Docker - change the target for multi stage buildsVisual Studio 2017 Docker - 更改多阶段构建的目标
【发布时间】:2018-06-08 12:46:51
【问题描述】:

如果我有一个具有多个阶段(例如基础和构建)的 docker 文件,有没有办法更改 Visual Studio 在调试容器时使用的 docker 命令 - 它似乎使用 docker 文件中的第一个构建,而不调用后续阶段。

这是我的 docker 文件:

FROM microsoft/aspnetcore:2.0.3 AS base
WORKDIR /app
EXPOSE 80

FROM microsoft/aspnetcore-build:2.0.3 AS build
WORKDIR /src
COPY *.sln ./
COPY Web/Web.csproj Web/
RUN dotnet restore
COPY . .
WORKDIR /src/Web
RUN dotnet build -c Release -o /app

FROM build AS publish
#RUN npm install
RUN dotnet publish -c Release -o /app

FROM base AS final
WORKDIR /app
COPY --from=publish /app .
# Set the entry point of the application.
ENTRYPOINT ["dotnet", "Web.dll"]

当我按f5时,它将使用基础镜像创建容器,随后导致错误,因为该项目需要安装aspnetcore-build镜像的节点;我可以通过将基础映像更改为 aspnetcore-build 来解决此问题。

但是,有没有办法告诉visual studio中的项目是多阶段构建,需要使用构建呢?

我对 docker 很陌生,所以也许我遗漏了一些明显的东西。

【问题讨论】:

标签: docker visual-studio-2017 .net-core dockerfile


【解决方案1】:

当您在 VS 2017 上使用多阶段 Dockerfile 时,您可以在调试和发布模式下运行它。

在调试模式下,VS 将使用“base”目标和标签“DEV”设置 docker 构建,因此 docker 将构建一个空图像,正如您已经指出的那样。

然后VS会启动一个你的镜像容器,所以一旦它运行就会将代码发布到容器内的当前WORKDIR,启动应用程序并附加到调试。

更新

那周起泡,我发现VS在obj\docker文件夹下生成了一个docker-compose文件,负责DEV模式下的构建。

【讨论】:

  • 你知道这是否在任何地方都有正式记录吗?是我自己还是 Visual Studio Docker 教程完全不完整?
【解决方案2】:

我放弃并将基础镜像从 aspnetcore 更改为 aspnetcore-build,如下所示:

FROM microsoft/aspnetcore-build:2.0 AS base

更新: 在 vs2019 中,现在我们可以为调试设置状态目标 :) https://developercommunity.visualstudio.com/content/problem/274941/dockerfile-image-for-building-multistage-nodejs-mi.html

【讨论】:

    【解决方案3】:

    根据this blog post,当您按 F5 时,Visual Studio构建第一个图像。但是,我观察到仅在使用Debug 配置时会发生这种情况(如正确说明的by Matheus' Answer)。

    我将所有解决方案配置更改为仅对 docker 项目 (.dcproj) 使用 Release 配置。这将构建所有图像并正确执行多阶段构建,而无需将 --target 设置为任何值。

    编辑

    但是,无法从 Visual Studio 中调试此配置。为了允许在容器内进行本地调试,您应该有一个不使用多阶段构建的单独 Dockerfile。

    【讨论】:

    • 它违背了需要不同的 Dockerifle 来发布和构建的目的,所以我不能说这是一个解决方案,而是一个解决方法。
    • 好电话。这个信息很难找到。此外,我将第二张图片命名为“runtime”:FROM mcr.microsoft.com/dotnet/aspnet:3.1-alpine AS runtime。然后我将 csproj 配置为在使用调试快捷方式时运行该映像:<DockerfileFastModeStage>runtime</DockerfileFastModeStage>
    【解决方案4】:

    如果我清楚地理解我今天阅读的内容,Visual Studio 采取的调试步骤是(在调试模式下):

    • 在 Visual Studio 中构建项目文件
    • 基于 Dockerfile 中的 base 构建一个特殊容器(正如其他人所提到的)
    • 启动容器,源全部映射到使用卷中,执行构建的 dll。
    • 继续调试

    如果这符合我的想法,您可以将 npm install 添加到您的 csproj 文件中作为预构建步骤,然后您所需的模块应该可以通过卷挂载在 docker 中使用。

    类似:

    <Target Name="DebugRunNpm" BeforeTargets="Build" Condition=" '$(Configuration)' == 'Debug' And !Exists('node_modules') ">
        <Message Importance="high" Text="Performing first-run npm install..." />
        <Exec Command="npm install" />
    </Target>
    

    【讨论】:

      【解决方案5】:

      要使用 docker 文件中的构建目标配置,您需要添加一个 docker-compose.vs.debug.yml 文件。在该文件中,只需指定服务的构建目标即可。

      例子:

      version: '3.4'
      
      services:
        my.api:
          build:
            target: build
      

      【讨论】:

      • 关键点我在任何地方都没有看到...为此,docker-compose.dcproj 必须设置为 Visual Studio 的启动项目以设置正确的目标。
      • 我在这上面浪费了很多时间,直到我意识到 obj 目录中自动生成的 docker-compose.vs.debug.g.yml 文件 always 似乎使要构建的目标是 docker 文件中的第一个目标。我刚刚复制了这个自动生成的调试文件,将它移到我的 docker-compose 文件旁边,然后手动将目标更改为我想要的。微软关于这个微妙细节的绝对糟糕的文档,现在我需要大约 6 个小时的时间回来。
      猜你喜欢
      • 2018-09-16
      • 1970-01-01
      • 1970-01-01
      • 2018-06-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-13
      • 2022-11-25
      相关资源
      最近更新 更多