容器包装器
Container Wrapper 扩展允许在指定的 Docker / LXC 镜像中运行构建步骤。 镜像是通过 docker pull
或 podman pull
命令拉取的,具体取决于在运行构建的代理上安装了哪种容器管理器。
TeamCity可以匿名拉取容器(如果镜像公开可用)或登录到注册表后拉取(用于私有注册表或避免匿名下载时的DockerHub惩罚)。 如果您需要 TeamCity 在提取镜像之前对注册表进行授权,请按照以下步骤配置 Docker 支持 构建功能:
在您的项目设置中,从侧边栏选择 Connections ,并按照 配置与 Docker 的连接 中的指示,为您的项目添加新的 Docker 或 Podman 连接。
在您的构建配置设置中,按照 Docker 支持 中的说明配置 Docker 支持 构建功能,添加在上一步中创建的连接。
该扩展适用于以下的 构建运行程序:
容器设置
在构建步骤设置的 Container Settings 部分中,您可以指定一个将用于运行构建步骤的镜像。 一旦指定了镜像,以下选项即可变得可用。
设置 | 描述 |
---|---|
在容器内运行步骤 | 如Docker Hub或其他注册处所述的镜像名称。 TeamCity 将从指定的镜像启动一个容器,并尝试在此容器内运行此构建步骤。 例如, 如果运行构建的代理安装了 Podman 而非 Docker,可以使用完整的镜像名称(例如, |
镜像平台 | 选择 <Any>(默认),Linux,或 Windows。 请注意,Podman 不支持 Windows 镜像。 |
明确拉取镜像 | 如果启用,将在启动 |
额外的运行参数 | 允许为 |
容器包装器如何运行
从技术上讲,构建运行程序的命令被包装在一个 shell 脚本中,这个脚本在容器内部执行,使用 docker run
或 podman run
命令。 要查看已启动进程的详细信息、脚本文本等,请在 详细模式 中检查构建日志。
容器包装器将路径映射到构建检出目录以及其他代理目录,如 buildAgent/work ,以便所有这些目录在构建代理和容器包装器 内部具有相同的位置。
如果进程环境包含由之前的 Docker Compose 构建步骤设置的 TEAMCITY_DOCKER_NETWORK
环境变量,那么这个网络将会通过 --网络
开关传递给已启动的 docker run
命令。
在 Linux 上恢复文件所有权
使用 Docker 的构建代理在每一步运行在容器内部的末尾执行 chown
命令,以恢复 buildAgent
用户对检出目录的访问权限。 此操作可以防止与构建代理无法删除不再需要的由 root
所有权创建的容器文件相关的潜在问题。 使用 Podman 的代理不执行此步骤。
默认情况下,TeamCity 代理使用 Docker Hub 的 busybox
镜像来运行 chown
命令。 您可以使用 teamcity.internal.docker.busybox
参数指定一个替代的镜像名称,无论是在 buildAgent.properties
文件还是在 构建配置参数 中。
环境变量处理
TeamCity 将环境变量从 构建配置 传递到 Docker 或 Podman 进程,但它不会从 构建代理 传递环境变量,因为它们可能与容器环境无关。 在构建日志的 Verbose mode 中,可以查看传递的环境变量列表。
设置 Image 入口点
如果一个 Docker 镜像没有定义一个 ENTRYPOINT
,您仍然可以使用从命令行运行一个带有 ENTRYPOINT
的容器:
添加一个 Command Line 构建步骤。
将 Run 模式设置为 可执行的带参数。
在 命令可执行 字段中,指定目标容器中
ENTRYPOINT
的完整路径。在 Docker 设置 中,指定容器的名称。
TeamCity 将使用定义的 ENTRYPOINT
启动指定的 Docker 镜像。
设置容器用户
如果您的步骤在本地存储上创建或访问文件或文件夹,请确保这些操作是在具有足够权限的正确用户下执行的。 为了实现这一目标,将 --user=<value>
添加到跑步者的 额外运行参数 中。
主机的 UID 可以通过 env.UID
参数 ( --user=%env.UID%
) 获取。