容器包装器
Container Wrapper 扩展允许在指定的 Docker/Podman 镜像中运行构建步骤。 镜像是通过 docker pull
或 podman pull
命令拉取的,具体取决于在运行构建的代理上安装了哪种容器管理器。
note
要在 Kotlin DSL 中配置 Container Wrapper 扩展,请查看 MavenBuildStep 中的 Docker 示例。
TeamCity可以匿名拉取容器(如果镜像公开可用)或登录到注册表后拉取(用于私有注册表或避免匿名下载时的DockerHub惩罚)。 如果您需要 TeamCity 在拉取镜像之前授权到注册表,请按照以下步骤配置 Docker Registry Connections构建功能:
在项目设置中,从侧边栏选择 连接 ,并按照 配置与 Docker 的连接 中的说明,将新的 Docker 或 Podman 连接添加到您的项目中。
在您的构建配置设置中,使用上一步创建的连接配置 Docker 注册表连接 构建功能。
此扩展适用于以下 构建步骤:
note
Container Wrapper 是 TeamCity-Docker / Podman 集成工具集的一部分。 请参考本文档文章,了解有关软件需求、支持的环境以及此集成的其他常见方面的信息: 将 TeamCity 与容器管理器集成。
在构建步骤设置的 Container Settings 部分中,您可以指定一个将用于运行构建步骤的镜像。 除镜像名称外的所有选项最初都是隐藏的,只有在您指定此名称后才会显示。
- 在容器内运行步骤
镜像名称如 DockerHub或其他注册表中所述。 TeamCity 将从指定的镜像启动一个容器,并尝试在此容器中运行所需的构建步骤。 例如,`ruby:2.4` 将在 Ruby 容器(版本 2.4)中运行构建步骤。
如果运行构建的代理安装了 Podman 而非 Docker,可以使用完整的镜像名称(例如,
docker.io/library/alpine:latest
,而非alpine:latest
),或确保在构建代理机器上的 registries.conf 文件中指定了注册表域。 另见: 如何管理 Linux 容器注册表。- 额外的运行参数
允许为
docker/podman run
命令指定其他选项。 默认参数是--rm
,但您可以提供更多参数。 例如,添加自定义卷映射。note
如果您需要在此字段中使用 环境变量 (例如,
%env.FOO%
),请注意 TeamCity 仅将构建配置和项目中声明的变量传递到容器中。 在 buildAgent.properties 文件中声明的代理特定环境变量不会传递到容器中。如果您需要在此文件中声明的参数,请执行以下操作:
在 buildAgent.properties 中定义一个系统属性 (
system.FOO=BAR
)。添加一个 构建配置参数 ,名称为
system.FOO
,值为%system.FOO%
。在“Additional run arguments”字段中将系统属性引用为
%system.FOO%
。如果您需要在构建脚本中将相同的值用作环境变量,您还可以添加一个名称为
env.FOO
,值为%system.FOO%
的构建配置参数。
TeamCity 在容器中启动构建步骤时执行以下操作:
将构建步骤的内容包装在一个 shell 脚本中
通过
docker/podman run
启动一个容器通过
docker/podman exec
在此容器中执行 shell 脚本
要查看已启动进程的详细信息、脚本文本等,请在 详细模式 中检查构建日志。
容器包装器将路径映射到 构建签出目录和其他代理目录(如 buildAgent/work ),以便所有这些目录在构建代理和包装器内部具有相同的位置。
如果进程环境包含由之前的 Docker Compose 构建步骤设置的 TEAMCITY_DOCKER_NETWORK
环境变量,那么这个网络将会通过 --网络
开关传递给已启动的 docker run
命令。
使用 Docker 的构建代理在每一步运行在容器内部的末尾执行 chown
命令,以恢复 buildAgent
用户对检出目录的访问权限。 此操作可以防止与构建代理无法删除不再需要的由 root
所有权创建的容器文件相关的潜在问题。 使用 Podman 的代理不执行此步骤。
默认情况下,TeamCity 代理使用 Docker Hub 的 busybox
镜像来运行 chown
命令。 您可以使用 teamcity.internal.docker.busybox
参数指定一个替代的镜像名称,无论是在 buildAgent.properties
文件还是在 构建配置参数 中。
tip
您可能想要禁用恢复文件所有权的功能。 例如,如果
userns-remap
包用于处理在 Docker 下创建的文件的所有权。 为此,将teamcity.docker.chown.enabled=false
配置参数添加到buildAgent.properties
文件中。 因此,TeamCity 在构建结束时不会尝试恢复文件的权限。
TeamCity 将环境变量从 构建配置 传递到 Docker 或 Podman 进程,但它不会从 构建代理 传递环境变量,因为它们可能与容器环境无关。 在构建日志的 Verbose mode 中,可以查看传递的环境变量列表。
如果一个 Docker 镜像没有定义一个 ENTRYPOINT
,您仍然可以使用从命令行运行一个带有 ENTRYPOINT
的容器:
添加一个 Command Line 构建步骤。
将 Run 模式设置为 可执行的带参数。
在 命令可执行 字段中,指定目标容器中
ENTRYPOINT
的完整路径。在 Docker 设置 中,指定容器的名称。
TeamCity 将使用定义的 ENTRYPOINT
启动指定的 Docker 镜像。
如果您的步骤在本地存储上创建或访问文件或文件夹,请确保这些操作是在具有足够权限的正确用户下执行的。 为此,请将 --user=<value>
添加到运行器的 额外的运行参数。
steps {
script {
// ...
dockerImage = "python:windowsservercore-ltsc2022"
dockerRunParameters = "--user=1001"
}
}
主机的 UID 可以通过 env.UID
参数 (--user=%env.UID%
) 获取。