从命令行生成容器项目

如果要使用 Visual Studio 外部的 Dockerfile 生成容器项目,可以使用 docker build (或 podman build)或 dotnet publish /t:PublishContainer 从命令行生成。

如果使用的是 .NET SDK 生成类型,则没有 Dockerfile,因此不能使用 docker buildpodman build,而是使用 dotnet publish /t:PublishContainer 在命令行上生成。

如果要使用 Visual Studio 外部的 Dockerfile 生成容器项目,可以使用 docker builddotnet publish /t:PublishContainer 从命令行生成。

如果使用的是 .NET SDK 构建类型,就没有 Dockerfile,因此无法使用 docker build;而应在命令行上使用 dotnet publish /t:PublishContainer 进行构建。

如果要使用 Visual Studio 外部的 Dockerfile 生成容器项目,可以使用 docker builddotnet publish /t:PublishContainer 从命令行生成。

先决条件

先决条件

先决条件

  • Docker Desktop
  • 安装了 ASP.NET 和 Web 开发Azure 开发工作负载、.NET 桌面开发和/或 .NET Core 跨平台开发工作负载的 Visual Studio 2019 或更高版本

使用 Docker 生成

若要从命令行生成容器化解决方案,通常可以对解决方案中的每个项目使用命令 docker build <context>。 提供生成上下文参数。 Dockerfile 的生成上下文是本地计算机上的一个文件夹,用作生成映像的工作文件夹。 例如,将文件复制到容器时,它是要复制的文件所在的文件夹。 在 .NET Core 项目中,默认使用包含解决方案文件(.sln或 .slnx)的文件夹。 此参数表示为相对路径,对于项目文件夹中的 Dockerfile 及其父文件夹中的解决方案文件,此参数通常为“...”。

docker build -f Dockerfile ..

对于 .NET Framework 项目,默认生成上下文是项目文件夹,而不是解决方案文件夹。

可以通过设置 DockerfileContext 属性在项目文件中设置生成上下文。 例如

<PropertyGroup>
   <DockerfileContext>contextfolder</DockerfileContext>
</PropertyGroup>

使用 Docker 构建或 Podman 构建

若要从命令行生成容器化解决方案,通常可以对解决方案中的每个项目使用命令 docker build <context> (或 podman build <context>)。 提供生成上下文参数。 Dockerfile 的生成上下文是本地计算机上的一个文件夹,用作生成映像的工作文件夹。 例如,将文件复制到容器时,它是要复制的文件所在的文件夹。 在 .NET Core 项目中,默认使用包含解决方案文件(.sln或 .slnx)的文件夹。 此参数表示为相对路径,对于项目文件夹中的 Dockerfile 及其父文件夹中的解决方案文件,此参数通常为“...”。

docker build -f Dockerfile ..
podman build -f Dockerfile ..

可以通过设置 ContainerBuildContext 属性在项目文件中设置生成上下文。 例如

<PropertyGroup>
   <ContainerBuildContext>contextfolder</ContainerBuildContext>
</PropertyGroup>

Dockerfile 中的相对路径相对于生成上下文,因此,如果更改上下文,请务必相应地更新相对路径。

使用 Visual Studio 17.11 及更高版本,向项目添加 Docker 支持时,可以为生成上下文指定文件夹。 如果要更改生成上下文,可以删除 Dockerfile(如果它没有要保留的其他更改),并重新运行 添加 Docker 支持,这次指定新的生成上下文。 新的 Dockerfile 将更新相对路径,以对应于新的构建上下文。

向项目添加容器支持时,可以为生成上下文指定文件夹。 如果要更改生成上下文,可以删除 Dockerfile(如果它没有要保留的其他更改),并重新运行 添加容器支持,这次指定新的生成上下文。 新的 Dockerfile 将更新相对路径,以对应于新的构建上下文。

使用 MSBuild

说明

本部分介绍如何在选择 Dockerfile 容器生成类型时自定义容器。 如果使用 .NET SDK 生成类型,则自定义选项不同,本文中的信息不适用。 相反,请参阅 使用 dotnet publish容器化 .NET 应用。

Visual Studio 为 .NET Framework 项目创建的 Dockerfiles(以及使用 Visual Studio 2017 Update 4 之前的 Visual Studio 版本创建的 .NET Core 项目)不是多阶段 Dockerfiles。 这些 Dockerfiles 中的步骤不会编译代码。 相反,当 Visual Studio 生成 .NET Framework Dockerfile 时,它首先使用 MSBuild 编译项目。 成功后,Visual Studio 将生成 Dockerfile,只需将 MSBuild 的生成输出复制到生成的 Docker 映像中。 由于编译代码的步骤不包括在 Dockerfile 中,因此不能使用命令行中的 docker build 生成 .NET Framework Dockerfiles。 应使用 MSBuild 生成这些项目。

若要为单个 Docker 容器项目生成映像,可以将 MSBuild 与 /t:ContainerBuild 命令选项一起使用。 此命令告知 MSBuild 生成目标 ContainerBuild 而不是默认目标 Build。 例如:

MSBuild MyProject.csproj /t:ContainerBuild /p:Configuration=Release

从 Visual Studio IDE 生成解决方案时,会看到与在 输出 窗口中看到的输出类似。 始终使用 /p:Configuration=Release,因为在 Visual Studio 使用多阶段生成优化的情况下,生成 调试 配置时的结果可能不符合预期。 请参阅 自定义容器映像以调试

如果使用 Docker Compose 项目,请使用此命令生成映像:

msbuild /p:SolutionPath=<solution-name>.sln /p:Configuration=Release docker-compose.dcproj

若要查看 MSBuild 日志,请参阅 使用 MSBuild获取生成日志。

从命令行生成

Visual Studio 使用快速模式(如果已启用)生成配置为最适合开发和调试的容器映像,因此不建议在快速模式生成后从输出窗口中复制 docker 生成命令。 若要在不标准优化的情况下生成标准映像,可以右键单击 Dockerfile 并选择 “生成 Docker 映像 ”选项。

Visual Studio 使用快速模式(如果已启用)生成配置为最适合开发和调试的容器映像,因此不建议在快速模式生成后从“输出”窗口复制 docker buildpodman build 命令。 若要在不标准优化的情况下生成标准映像,可以右键单击 Dockerfile 并选择 “生成映像 ”选项。

Visual Studio 使用 dev 标记来指定它专门准备的映像,以便优化调试期间的启动时间。 但是,这些图像不应在 Visual Studio 的上下文之外使用。 此标记表明图像具有非标准修改和自定义,例如,支持快速模式调试。 请参阅 Visual Studio 中的自定义 Docker 容器