使用 dotnet publish 容器化 .NET 应用

容器具有很多特性和优点,如具有不可变的基础结构、提供可移植的体系结构和实现可伸缩性。 此映像可用于为本地开发环境、私有云或公有云创建容器。 本教程介绍如何使用 dotnet publish 命令容器化 .NET 应用程序。

先决条件

安装以下必备组件:

除了这些先决条件外,建议你熟悉 .NET 中的辅助角色服务

创建 .NET 应用

你需要要容器化的 .NET 应用,因此请首先根据模板创建一个新应用。 打开终端,创建一个工作文件夹 (sample-directory)(如果尚未创建),然后更改目录,使你位于其中。 在工作文件夹中,运行下面的命令,在名为“Worker”的子目录中新建一个项目:

dotnet new worker -o Worker -n DotNet.ContainerImage

文件夹树将如下所示:

📁 sample-directory
    └──📂 Worker
        ├──appsettings.Development.json
        ├──appsettings.json
        ├──DotNet.ContainerImage.csproj
        ├──Program.cs
        ├──Worker.cs
        └──📂 obj
            ├── DotNet.ContainerImage.csproj.nuget.dgspec.json
            ├── DotNet.ContainerImage.csproj.nuget.g.props
            ├── DotNet.ContainerImage.csproj.nuget.g.targets
            ├── project.assets.json
            └── project.nuget.cache

dotnet new 命令将创建一个名为 Worker 的新文件夹,并生成一个辅助角色服务,该服务在运行时将每秒记录一条消息。 从终端会话,更改目录并导航到 Worker 文件夹。 使用 dotnet run 命令启动应用。

dotnet run
Building...
info: DotNet.ContainerImage.Worker[0]
      Worker running at: 10/18/2022 08:56:00 -05:00
info: Microsoft.Hosting.Lifetime[0]
      Application started. Press Ctrl+C to shut down.
info: Microsoft.Hosting.Lifetime[0]
      Hosting environment: Development
info: Microsoft.Hosting.Lifetime[0]
      Content root path: .\Worker
info: DotNet.ContainerImage.Worker[0]
      Worker running at: 10/18/2022 08:56:01 -05:00
info: DotNet.ContainerImage.Worker[0]
      Worker running at: 10/18/2022 08:56:02 -05:00
info: DotNet.ContainerImage.Worker[0]
      Worker running at: 10/18/2022 08:56:03 -05:00
info: Microsoft.Hosting.Lifetime[0]
      Application is shutting down...
Attempting to cancel the build...

辅助角色模板无限期循环。 使用取消命令 Ctrl+C 可以停止运行。

添加 NuGet 包

当前需要 Microsoft.NET.Build.Containers NuGet 包才能将非 web 项目发布为容器。 若要将 Microsoft.NET.Build.Containers NuGet 包添加到辅助角色模板,请运行以下 dotnet add package 命令:

dotnet add package Microsoft.NET.Build.Containers

提示

如果要生成 web 应用并使用 .NET SDK 7.0.300 或更高版本,则无需包,SDK 包含开箱即用的相同功能。

设置容器映像名称

将应用发布为容器时,可以使用各种配置选项。

默认情况下,容器映像名称是项目的 AssemblyName。 如果该名称作为容器映像名称无效,则可以通过指定 ContainerRepository 来覆盖它,如以下项目文件所示:

<Project Sdk="Microsoft.NET.Sdk.Worker">

  <PropertyGroup>
    <TargetFramework>net8.0</TargetFramework>
    <Nullable>enable</Nullable>
    <ImplicitUsings>enable</ImplicitUsings>
    <UserSecretsId>dotnet-DotNet.ContainerImage-2e40c179-a00b-4cc9-9785-54266210b7eb</UserSecretsId>
    <ContainerRepository>dotnet-worker-image</ContainerRepository>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Microsoft.Extensions.Hosting" Version="8.0.0" />
  </ItemGroup>
</Project>

有关详细信息,请参阅 ContainerRepository

默认情况下,容器映像名称是项目的 AssemblyName。 如果该名称作为容器映像名称无效,则可以通过指定 ContainerImageName(已过时)或首选的 ContainerRepository 来替代它,如以下项目文件所示:

<Project Sdk="Microsoft.NET.Sdk.Worker">

  <PropertyGroup>
    <TargetFramework>net7.0</TargetFramework>
    <Nullable>enable</Nullable>
    <ImplicitUsings>enable</ImplicitUsings>
    <UserSecretsId>dotnet-DotNet.ContainerImage-2e40c179-a00b-4cc9-9785-54266210b7eb</UserSecretsId>
    <ContainerImageName>dotnet-worker-image</ContainerImageName>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Microsoft.Extensions.Hosting" Version="7.0.1" />
    <PackageReference Include="Microsoft.NET.Build.Containers" Version="7.0.401" />
  </ItemGroup>
</Project>

有关详细信息,请参阅 ContainerImageName

发布 .NET 应用

若要将 .NET 应用发布为容器,请使用以下 dotnet publish 命令:

dotnet publish --os linux --arch x64 /t:PublishContainer -c Release

前面的 .NET CLI 命令将应用发布为容器:

  • 以 Linux 为目标,将其作为 OS (--os linux)。
  • 指定 x64 体系结构 (--arch x64)。
  • 使用发布配置 (-c Release)。

重要

若要在本地生成容器,必须运行 Docker 守护程序。 如果在尝试将应用发布为容器时未运行,则会遇到类似于以下内容的错误:

..\build\Microsoft.NET.Build.Containers.targets(66,9): error MSB4018:
   The "CreateNewImage" task failed unexpectedly. [..\Worker\DotNet.ContainerImage.csproj]

提示

根据要容器化的应用类型,命令行开关(选项)可能会有所不同。 例如,只有非 Web .NET 应用(如 consoleworker 模板)才需要 /t:PublishContainer 参数。 对于 Web 模板,请将 /t:PublishContainer 参数替换为 -p:PublishProfile=DefaultContainer。 有关详细信息,请参阅 .NET SDK 容器生成,问题 #141

该命令生成的输出以下示例所示:

Determining projects to restore...
  All projects are up-to-date for restore.
  DotNet.ContainerImage -> .\Worker\bin\Release\net8.0\linux-x64\DotNet.ContainerImage.dll
  DotNet.ContainerImage -> .\Worker\bin\Release\net8.0\linux-x64\publish\
  Building image 'dotnet-worker-image' with tags latest on top of base image mcr.microsoft.com/dotnet/aspnet:8.0
  Pushed container 'dotnet-worker-image:latest' to Docker daemon
Determining projects to restore...
  All projects are up-to-date for restore.
  DotNet.ContainerImage -> .\Worker\bin\Release\net7.0\linux-x64\DotNet.ContainerImage.dll
  DotNet.ContainerImage -> .\Worker\bin\Release\net7.0\linux-x64\publish\
  Building image 'dotnet-worker-image' with tags 1.0.0 on top of base image mcr.microsoft.com/dotnet/aspnet:7.0
  Pushed container 'dotnet-worker-image:1.0.0' to Docker daemon

此命令将辅助角色应用编译到 publish 文件夹,并将容器推送到本地 docker 注册表。

配置容器映像

可通过 MSBuild 属性控制生成的容器的许多方面。 通常,如果可以使用 Dockerfile 中的命令来设置某些配置,则可以通过 MSBuild 执行相同的操作

注意

唯一的例外是 RUN 命令。 由于容器的生成方式,无法模拟这些命令。 如果需要此功能,则需要使用 Dockerfile 来生成容器映像。

ContainerArchiveOutputPath

从 .NET 8 开始,可以直接创建容器作为 tar.gz 存档。 如果你的工作流并不简单,并且要求你在推送图像之前对图像运行扫描工具(例如),则此功能会非常有用。 创建存档后,可以移动、扫描或将存档加载到本地 Docker 工具链中。

要发布到存档,请将 ContainerArchiveOutputPath 属性添加到 dotnet publish 命令,例如:

dotnet publish \
  -p PublishProfile=DefaultContainer \
  -p ContainerArchiveOutputPath=./images/sdk-container-demo.tar.gz

可以指定文件夹名称或包含特定文件名的路径。 如果指定文件夹名称,则为映像存档文件生成的文件名将是 $(ContainerRepository).tar.gz。 这些存档可包含多个标记,仅当为所有 ContainerImageTags 文件创建单个文件时才这样。

容器映像命名配置

容器映像遵循特定的命名约定。 映像的名称由多个部分组成,包括注册表、可选端口、存储库和可选标记及系列。

REGISTRY[:PORT]/REPOSITORY[:TAG[-FAMILY]]

例如,请考虑完全限定的 mcr.microsoft.com/dotnet/runtime:8.0-alpine 映像名称:

  • mcr.microsoft.com 是注册表(在本例中表示 Microsoft 容器注册表)。
  • dotnet/runtime 是存储库(但有些认为这是 user/repository)。
  • 8.0-alpine 是标记和系列(系列是一个可选说明符,有助于消除 OS 打包的歧义)。

以下部分中介绍的一些属性相当于管理所生成的映像名称的各个方面。 请考虑下表,它映射了映像名称与生成属性之间的关系:

映像名称部分 MSBuild 属性 示例值
REGISTRY[:PORT] ContainerRegistry mcr.microsoft.com:443
PORT ContainerPort :443
REPOSITORY ContainerRepository dotnet/runtime
TAG ContainerImageTag 8.0
FAMILY ContainerFamily -alpine
映像名称部分 MSBuild 属性 示例值
REGISTRY[:PORT] ContainerRegistry mcr.microsoft.com:443
PORT ContainerPort :443
REPOSITORY ContainerImageName dotnet/runtime
TAG ContainerImageTag 8.0

以下部分介绍可用于控制所生成的容器映像的各种属性。

ContainerBaseImage

容器基础映像属性控制用作映像基础的映像。 默认情况下,将根据项目的属性推断以下值:

  • 如果项目是自包含的,则 mcr.microsoft.com/dotnet/runtime-deps 映像将用作基础映像。
  • 如果项目是 ASP.NET Core 项目,则 mcr.microsoft.com/dotnet/aspnet 映像将用作基础映像。
  • 否则,mcr.microsoft.com/dotnet/runtime 映像将用作基础映像。

映像的标记被推断为所选 TargetFramework 的数字组件。 例如,以 net6.0 为目标的项目将导致推断的基础映像的 6.0 标记,net7.0-linux 项目将使用 7.0 标记,依此类推。

如果在此处设置值,则应设置要用作基础映像的映像的完全限定名称,并包括你喜欢的任何标记:

<PropertyGroup>
    <ContainerBaseImage>mcr.microsoft.com/dotnet/runtime:8.0</ContainerBaseImage>
</PropertyGroup>
<PropertyGroup>
    <ContainerBaseImage>mcr.microsoft.com/dotnet/runtime:7.0</ContainerBaseImage>
</PropertyGroup>

ContainerFamily

从 .NET 8 开始,可以使用 ContainerFamily MSBuild 属性选择 Microsoft 提供的不同系列的容器映像作为应用程序的基础映像。 设置后,该值将追加到所选 TFM 特定标记的末尾,从而更改所提供的标记。 例如,若要使用 .NET 基础映像的 Alpine Linux 变体,可以将 ContainerFamily 设置为 alpine

<PropertyGroup>
    <ContainerFamily>alpine</ContainerFamily>
</PropertyGroup>

前面的项目配置导致面向 .NET 8 的应用的最终标记为 8.0-alpine

该字段是自由格式的,通常可用于选择不同的操作系统发行版、默认包配置或对基础映像进行的任何其他风格的更改。 设置 ContainerBaseImage 时,该字段将被忽略。 有关详细信息,请参阅 .NET 容器映像

ContainerRuntimeIdentifier

如果 ContainerBaseImage 支持多个平台,则容器运行时标识符属性控制容器使用的操作系统和体系结构。 例如,mcr.microsoft.com/dotnet/runtime 映像当前支持 linux-x64linux-armlinux-arm64win10-x64 映像(它们都位于同一标记后面),因此工具需要一种方法来告知你打算使用哪个版本。 默认情况下,它设置为发布容器时选择的 RuntimeIdentifier 值。 很少需要显式设置此属性 - 而是使用 dotnet publish 命令的 -r 选项。 如果你选择的映像不支持你选择的 RuntimeIdentifier,则会生成一个错误,说明映像支持的 RuntimeIdentifiers。

始终可以将 ContainerBaseImage 属性设置为完全限定的映像名称(包括标记),以避免使用此属性。

<PropertyGroup>
    <ContainerRuntimeIdentifier>linux-arm64</ContainerRuntimeIdentifier>
</PropertyGroup>

有关 .NET 支持的运行时标识符的详细信息,请参阅 RID 目录

ContainerRegistry

容器注册表属性控制目标注册表,即新创建的映像将推送到的位置。 默认情况下,系统会将项目推送到本地 Docker 守护程序,但你也可以指定远程注册表。 使用需要身份验证的远程注册表时,请使用已知 docker login 机制进行身份验证。 有关更多信息,请参阅对容器注册表进行身份验证。 有关使用此属性的具体示例,请考虑以下 XML 示例:

<PropertyGroup>
    <ContainerRegistry>registry.mycorp.com:1234</ContainerRegistry>
</PropertyGroup>

此工具支持发布到支持 Docker 注册表 HTTP API V2 的任何注册表。 这明确地(可能更隐含地)包括以下注册表:

有关使用这些注册表的说明,请参阅特定于注册表的说明

ContainerRepository

容器存储库是映像本身的名称,例如 dotnet/runtimemy-app。 默认情况下,使用项目的 AssemblyName

<PropertyGroup>
    <ContainerRepository>my-app</ContainerRepository>
</PropertyGroup>

ContainerImageName

容器映像名称控制映像本身的名称,例如 dotnet/runtimemy-app。 默认情况下,使用项目的 AssemblyName

<PropertyGroup>
    <ContainerImageName>my-app</ContainerImageName>
</PropertyGroup>

注意

从 .NET 8 开始,ContainerImageName 已被弃用,改用 ContainerRepository

映像名称由一个或多个斜杠分隔的段组成,每个段只能包含小写字母数字字符、句点、下划线和短划线,并且必须以字母或数字开头。 任何其他字符都会导致引发错误。

ContainerImageTag(s)

容器映像标记属性控制为映像生成的标记。 若要指定单个标记用法 ContainerImageTag 和多个标记,请使用 ContainerImageTags

重要

使用 ContainerImageTags 时,最终会得到多个映像,每个映像一个唯一标记。

标记通常用于引用应用的不同版本,但它们也可以引用不同的操作系统分发版,甚至不同的配置。

从 .NET 8 开始,如果未提供标记,则默认值为 latest

默认情况下,项目的 Version 用作标记值。

若要替代默认值,请指定以下任一项:

<PropertyGroup>
    <ContainerImageTag>1.2.3-alpha2</ContainerImageTag>
</PropertyGroup>

若要指定多个标记,请在 ContainerImageTags 属性中使用一组以分号分隔的标记,类似于设置多个 TargetFrameworks

<PropertyGroup>
    <ContainerImageTags>1.2.3-alpha2;latest</ContainerImageTags>
</PropertyGroup>

标记最多只能包含 127 个字母数字字符、句点、下划线和短划线。 它们必须以字母数字字符或下划线开头。 任何其他格式都会导致引发错误。

注意

使用 ContainerImageTags 时,标记由字符 ; 分隔。 如果从命令行调用 dotnet publish(大多数 CI/CD 环境都是如此),则需要将值外部以单引号 ' 括起,内部以双引号 " 括起,例如 (='"tag-1;tag-2"')。 请考虑以下 dotnet publish 命令:

dotnet publish -p ContainerImageTags='"1.2.3-alpha2;latest"'

这会导致生成两个映像:my-app:1.2.3-alpha2my-app:latest

提示

如果遇到 ContainerImageTags 属性问题,请转而考虑设定环境变量 ContainerImageTags 的范围:

ContainerImageTags='1.2.3;latest' dotnet publish

ContainerLabel

容器标签会将元数据标签添加到容器中。 标签在运行时对容器没有影响,但通常用于存储版本和创作元数据,以供安全扫描程序和其他基础结构工具使用。 可以指定任意数量的容器标签。

ContainerLabel 节点有两个属性:

  • Include:标签的键。
  • Value:标签的值(可能为空)。
<ItemGroup>
    <ContainerLabel Include="org.contoso.businessunit" Value="contoso-university" />
</ItemGroup>

有关默认创建的标签列表,请参阅默认容器标签

配置容器执行

若要控制容器的执行,可以使用以下 MSBuild 属性。

ContainerWorkingDirectory

容器工作目录节点控制容器的工作目录,如果不运行其他命令,则在其中执行命令的目录。

默认情况下,/app 目录值用作工作目录。

<PropertyGroup>
    <ContainerWorkingDirectory>/bin</ContainerWorkingDirectory>
</PropertyGroup>

ContainerPort

容器端口将 TCP 或 UDP 端口添加到容器的已知端口列表中。 这使得 Docker 等容器运行时能够自动将这些端口映射到主机。 这通常用作容器的文档,但也可用于启用自动端口映射。

ContainerPort 节点有两个属性:

  • Include:要公开的端口号。
  • Type:默认为 tcp,有效值为 tcpudp
<ItemGroup>
    <ContainerPort Include="80" Type="tcp" />
</ItemGroup>

从 .NET 8 开始,当未根据几个已知的 ASP.NET 环境变量显式提供 ContainerPort 时,则会推断该值:

  • ASPNETCORE_URLS
  • ASPNETCORE_HTTP_PORTS
  • ASPNETCORE_HTTPS_PORTS

如果存在这些环境变量,则会分析这些环境变量的值并将其转换为 TCP 端口映射。 这些环境变量从你基础映像(如果存在)中读取,或者通过 ContainerEnvironmentVariable 项从项目中定义的环境变量中读取。 有关详细信息,请参阅 ContainerEnvironmentVariable

ContainerEnvironmentVariable

容器环境变量节点可用于向容器添加环境变量。 环境变量将立即可供容器中运行的应用访问,并且通常用于更改正在运行的应用的运行时行为。

ContainerEnvironmentVariable 节点有两个属性:

  • Include:环境变量的名称。
  • Value:环境变量的值。
<ItemGroup>
  <ContainerEnvironmentVariable Include="LOGGER_VERBOSITY" Value="Trace" />
</ItemGroup>

有关详细信息,请参阅 .NET 环境变量

配置容器命令

默认情况下,容器工具使用为应用生成的 AppHost 二进制文件(如果应用使用 AppHost)或 dotnet 命令加上应用的 DLL 来启动应用。

不过,可以通过使用 ContainerAppCommandContainerAppCommandArgsContainerDefaultArgsContainerAppCommandInstruction 的某种组合来控制应用程序的执行方式。

存在这些不同的配置点是因为不同的基础映像使用容器 ENTRYPOINTCOMMAND 属性的不同组合,并且希望能够支持所有这些基础映像。 默认值应适用于大多数应用,但如果要自定义应用启动行为,则应:

  • 标识要运行的二进制文件并将其设置为 ContainerAppCommand
  • 确定哪些自变量是运行应用程序必需的,并将它们设置为 ContainerAppCommandArgs
  • 确定哪些自变量(如果有)是可选的,并且可以被用户重写,并将它们设置为 ContainerDefaultArgs
  • ContainerAppCommandInstruction 设置为 DefaultArgs

有关详细信息,请参阅以下配置项。

ContainerAppCommand

应用命令配置项是应用的逻辑入口点。 对于大多数应用,这是 AppHost,它是针对应用生成的可执行二进制文件。 如果应用未生成 AppHost,则此命令通常为 dotnet <your project dll>。 这些值将应用在基础容器中的任何 ENTRYPOINT 之后,或者如果未定义 ENTRYPOINT,则直接应用。

ContainerAppCommand 配置具有一个 Include 属性,该属性表示在入口点命令中使用的命令、选项或自变量:

<ItemGroup Label="ContainerAppCommand Assignment">
  <!-- This is how you would start the dotnet ef tool in your container -->
  <ContainerAppCommand Include="dotnet" />
  <ContainerAppCommand Include="ef" />

  <!-- This shorthand syntax means the same thing, note the semicolon separating the tokens. -->
  <ContainerAppCommand Include="dotnet;ef" />
</ItemGroup>

ContainerAppCommandArgs

此应用命令自变量配置项代表应该应用于 ContainerAppCommand 的任何逻辑上必需的应用自变量。 默认情况下,不会为应用生成任何自变量。 如果存在,则这些自变量在运行时将应用到容器。

ContainerAppCommandArgs 配置具有单个 Include 属性,该属性表示要应用于 ContainerAppCommand 命令的选项或自变量。

<ItemGroup>
  <!-- Assuming the ContainerAppCommand defined above, 
       this would be the way to force the database to update.
  -->
  <ContainerAppCommandArgs Include="database" />
  <ContainerAppCommandArgs Include="update" />

  <!-- This is the shorthand syntax for the same idea -->
  <ContainerAppCommandArgs Include="database;update" />
</ItemGroup>

ContainerDefaultArgs

此默认自变量配置项表示应用的任何用户可重写自变量。 这是一种提供默认设置的好方法,你的应用可能需要以一种易于启动,同时仍然易于自定义的方式运行。

ContainerDefaultArgs 配置具有单个 Include 属性,该属性表示要应用于 ContainerAppCommand 命令的选项或自变量。

<ItemGroup>
  <!-- Assuming the ContainerAppCommand defined above, 
       this would be the way to force the database to update.
  -->
  <ContainerDefaultArgs Include="database" />
  <ContainerDefaultArgs Include="update" />

  <!-- This is the shorthand syntax for the same idea -->
  <ContainerDefaultArgs Include="database;update" />
</ItemGroup>

ContainerAppCommandInstruction

应用命令指令配置有助于控制 ContainerEntrypointContainerEntrypointArgsContainerAppCommandContainerAppCommandArgsContainerDefaultArgs 的组合方式,以形成在容器中运行的最终命令。 这在很大程度上取决于基础映像中是否存在 ENTRYPOINT。 此属性采用以下三个值之一:"DefaultArgs""Entrypoint""None"

  • Entrypoint
    • 在此模式下,入口点由 ContainerAppCommandContainerAppCommandArgsContainerDefaultArgs 定义。
  • None
    • 在此模式下,入口点由 ContainerEntrypointContainerEntrypointArgsContainerDefaultArgs 定义。
  • DefaultArgs
    • 这是最复杂的模式 - 如果不存在任何 ContainerEntrypoint[Args] 项,则使用 ContainerAppCommand[Args]ContainerDefaultArgs 创建入口点和命令。 系统会跳过硬编码为 dotnet/usr/bin/dotnet 的基础映像的基础映像入口点,以便你拥有完全的控制权。
    • 如果同时存在 ContainerEntrypointContainerAppCommand,则 ContainerEntrypoint 将成为入口点,ContainerAppCommand 将成为命令。

注意

自 .NET 8 起,已弃用 ContainerEntrypointContainerEntrypointArgs 配置项。

重要

这适用于高级用户,大多数应用程序不需要将其入口点自定义到这种程度。 如需了解详细信息,或者如果想提供适用于你的方案的用例,请参阅 GitHub:.NET SDK 容器生成讨论

ContainerUser

用户配置属性控制作为容器运行身份的默认用户。 这通常用于将容器作为非根用户运行,这是提高安全性的最佳做法。 此配置需要注意一些约束条件:

  • 它可以采用各种形式,例如用户名、linux 用户 ID、组名称、linux 组 ID、username:groupname 和其他 ID 变体。
  • 无法验证指定的用户或组是否存在于映像上。
  • 更改用户可能会改变应用程序的行为,尤其是在文件系统权限等方面。

该字段的默认值因项目 TFM 和目标操作系统而异:

  • 如果面向 .NET 8 或更高版本并使用 Microsoft 运行时映像,则:
    • 在 Linux 上使用无根用户 app(尽管用户 ID 引用了该用户)
    • 在 Windows 上使用无根用户 ContainerUser
  • 否则,不使用默认的 ContainerUser
<PropertyGroup>
  <ContainerUser>my-existing-app-user</ContainerUser>
</PropertyGroup>

提示

环境变量 APP_UID 用于在容器中设置用户信息。 该值可以来自基础映像中定义的环境变量(与 Microsoft .NET 映像的操作类似),也可以通过 ContainerEnvironmentVariable 语法自行设置。

不过,可以使用 ContainerEntrypointContainerEntrypointArgs 控制应用程序的执行方式。

ContainerEntrypoint

容器入口点可用于自定义容器的 ENTRYPOINT,这是启动容器时调用的可执行文件。 默认情况下,对于创建应用主机的生成,该值设置为 ContainerEntrypoint。 对于不创建可执行文件的生成,dotnet path/to/app.dll 将用作 ContainerEntrypoint

ContainerEntrypoint 节点具有单个属性:

  • Include:在 ContainerEntrypoint 命令中使用的命令、选项或自变量。

例如,请考虑以下示例 .NET 项目项组:

<ItemGroup Label="Entrypoint Assignment">
  <!-- This is how you would start the dotnet ef tool in your container -->
  <ContainerEntrypoint Include="dotnet" />
  <ContainerEntrypoint Include="ef" />

  <!-- This shorthand syntax means the same thing.
       Note the semicolon separating the tokens. -->
  <ContainerEntrypoint Include="dotnet;ef" />
</ItemGroup>

ContainerEntrypointArgs

容器入口点参数节点控制提供给 ContainerEntrypoint 的默认参数。 当 ContainerEntrypoint 是用户可能希望自己使用的程序时,应使用此选项。 默认情况下,不会代表你创建任何 ContainerEntrypointArgs

ContainerEntrypointArg 节点具有单个属性:

  • Include:要应用于 ContainerEntrypoint 命令的选项或参数。

请考虑以下示例 .NET 项目项组:

<ItemGroup>
  <!-- Assuming the ContainerEntrypoint defined above,
       this would be the way to update the database by
       default, but let the user run a different EF command. -->
  <ContainerEntrypointArgs Include="database" />
  <ContainerEntrypointArgs Include="update" />

  <!-- This is the shorthand syntax for the same idea -->
  <ContainerEntrypointArgs Include="database;update" />
</ItemGroup>

默认的容器标签

标签通常用于在容器映像上提供一致的元数据。 此包提供一些默认标签,以鼓励更好地维护生成的映像。

  • org.opencontainers.image.created 设置为当前 UTC DateTime 的 ISO 8601 格式。

有关详细信息,请参阅在现有标签基础结构之上实现常规标签

清理资源

在本文中,你已将 .NET 辅助角色作为容器映像发布。 如果需要,请删除此资源。 使用 docker images 命令来列出已安装的映像。

docker images

请参考以下示例输出:

REPOSITORY            TAG       IMAGE ID       CREATED          SIZE
dotnet-worker-image   1.0.0     25aeb97a2e21   12 seconds ago   191MB

提示

映像文件可能很大。 通常情况下,需要删除在测试和开发应用期间创建的临时容器。 如果计划在相应运行时的基础之上生成其他映像,通常会将基础映像与运行时一同安装。

若要删除映像,请复制映像 ID 并运行 docker image rm 命令:

docker image rm 25aeb97a2e21

后续步骤