从命令行生成容器项目

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

如果使用 .NET SDK 生成类型,则没有 Dockerfile,因此不能使用 docker build;请改用 MSBuilddotnet builddotnet publish 在命令行上生成。

使用 Docker 生成

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

docker build -f Dockerfile ..

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

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

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

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

使用 MSBuild

说明

本部分介绍如何在选择 Dockerfile 容器生成类型时自定义 Docker 容器。 如果使用 .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获取生成日志。