Visual Studio 2017 Docker - 更改多阶段构建的目标

问题描述 投票:0回答:6

如果我有一个具有多个阶段(例如基础和构建)的 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中的项目是多阶段构建,需要使用build呢?

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

docker visual-studio-2017 .net-core dockerfile
6个回答
9
投票

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

示例:

version: '3.4'

services:
  my.api:
    build:
      target: build

7
投票

根据这篇博文,当您按 F5 时,Visual Studio 仅构建第一个图像。但是,我观察到仅使用 Debug

 配置时会发生这种情况(如 Matheus 的答案
正确所述)。 我更改了所有解决方案配置,以仅对 docker 项目 (.dcproj) 使用

Release

配置。这将构建所有图像并正确执行多阶段构建,而无需将

--target
设置为任何内容。
编辑

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


3
投票

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

然后 VS 将启动您的映像的容器,因此一旦运行,就会将代码发布到容器内的当前 WORKDIR,启动应用程序并附加到调试。

更新

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


1
投票

在 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>



0
投票

FROM microsoft/aspnetcore-build:2.0 AS base

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


0
投票

https://learn.microsoft.com/en-us/visualstudio/containers/docker-compose-properties?view=vs-2022

可以通过将以下内容添加到 Visual Studio 中的 docker compose 项目来总结解决方案:

<DockerDevelopmentMode>Regular</DockerDevelopmentMode>

默认运行时,它会进入“快速”模式,该模式使用

...\obj\Docker\docker-compose.vs.debug.g.yml

文件。

在此文件中,它定义了

target

,将其设置为

build
然而,如果您定义

<DockerDevelopmentMode>Regular</DockerDevelopmentMode>

,它将运行发布文件:

...\obj\Docker\docker-compose.vs.release.g.yml

不会覆盖 

target

    

© www.soinside.com 2019 - 2024. All rights reserved.