如果我有一个具有多个阶段(例如基础和构建)的 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 文件中的构建目标配置,您需要添加 docker-compose.vs.debug.yml 文件。在该文件中,只需指定服务的构建目标即可。
示例:
version: '3.4'
services:
my.api:
build:
target: build
根据这篇博文,当您按 F5 时,Visual Studio 仅构建第一个图像。但是,我观察到仅使用 Debug
配置时会发生这种情况(如 Matheus 的答案正确所述)。 我更改了所有解决方案配置,以仅对 docker 项目 (.dcproj) 使用
Release
配置。这将构建所有图像并正确执行多阶段构建,而无需将
--target
设置为任何内容。编辑
但是,无法从 Visual Studio 中调试此配置。为了允许在容器内进行本地调试,您应该有一个不使用多阶段构建的单独的 Dockerfile。
在 DEBUG 模式下,VS 将使用“base”目标和标签“DEV”设置 docker 构建,因此 docker 将构建一个空映像,正如您已经指出的那样。
然后 VS 将启动您的映像的容器,因此一旦运行,就会将代码发布到容器内的当前 WORKDIR,启动应用程序并附加到调试。
更新
那周,我发现VS在obj\docker文件夹下生成了一个docker-compose文件,负责DEV模式下的构建。
在 Visual Studio 中构建项目文件
base
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>
可以通过将以下内容添加到 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
。