WSL Container Pipeline Tasks
为 Azure DevOps Services 和私有部署的 Azure DevOps Server 的 Windows 自托管代理提供 Wslc@1 流水线任务,用于构建、推送和管理容器镜像。任务按 Docker → Podman → nerdctl → wslc → Finch → Buildah 的顺序选择 PATH 中第一个可用的 CLI。
主要功能
- 构建和推送镜像,登录或退出仓库,启动或停止容器。
- 使用已授权的 Docker Registry 服务连接;Azure Container Registry(ACR)支持服务主体、托管标识和工作负载身份联合。
- 为镜像添加流水线及基础镜像信息,并可在推送后发布 Azure DevOps 镜像详情。
- 在同一作业中检测运行时变化,避免混用不同 CLI 的镜像和登录状态。
本扩展提供独立任务,不会修改内置的 Docker@2,也不会替换 Azure Pipelines 代理本身使用的 Docker。
使用条件
- Windows 自托管代理;受支持的
docker.exe、podman.exe、nerdctl.exe、wslc.exe、finch.exe 或 buildah.exe 至少有一个位于代理账户的 PATH。Podman 和 nerdctl 需要已配置的容器后端;wslc 需要 WSL 3.0.5 或更高版本及 WSL 容器功能。
- Finch 和 Buildah 在本任务的 Windows 环境中仅在相应 CLI 可用且后端已配置时尝试使用;本任务不安装 CLI,也不创建或启动 WSL/虚拟机后端。
- 代理版本至少为 3.238.0,且包含
Node20_1 运行时;Azure DevOps Server 需支持该代理版本。
- 使用专用代理账户,避免多个作业或进程共享仓库凭据。
- 私有仓库需要授权给流水线的 Docker Registry 服务连接。托管标识或联合身份必须正确配置,并具有仓库所需权限。
任务不安装或配置容器工具。自动选择首个已检测到的 CLI;如果它无法执行或无法连接后端,任务会报错,不会自动切换到其他 CLI。
私有部署时,可由服务器管理员在 Manage Extensions 上传 VSIX,再由项目集合管理员安装到目标集合。生产依赖已包含在 VSIX 中,但运行任务仍需访问服务器和镜像仓库。
示例
steps:
- task: Wslc@1
displayName: Sign in to the registry
inputs:
command: login
containerRegistry: myRegistryConnection
- task: Wslc@1
displayName: Build and push
inputs:
command: buildAndPush
containerRegistry: myRegistryConnection
repository: sample/app
Dockerfile: '**/Dockerfile'
buildContext: '**'
tags: |
$(Build.BuildId)
latest
- task: Wslc@1
displayName: Sign out of the registry
condition: always()
inputs:
command: logout
containerRegistry: myRegistryConnection
使用服务连接默认不会自动登录:推送私有仓库前需显式执行登录任务;也可对 push/buildAndPush 设置 loginBeforeCommand: true 在推送前自动登录。登录可能覆盖代理账户已有的同仓库凭据,执行登录即表示接受这一行为(无需额外确认开关)。任务不能恢复原有凭据,且代理中断时退出步骤不一定执行。
元数据和限制
addPipelineData 和 addBaseImageData 默认启用。未固定 digest 的基础镜像会先被拉取并检查,这会改变本地镜像缓存;无法确定唯一的仓库 digest 时只告警并跳过 digest 标签,构建继续。建议在 Dockerfile 中固定 digest。
- 未固定 digest 的基础镜像同时使用
FROM --platform、构建 --platform 或构建 --pull 时,会跳过 digest 标签并告警;请固定 digest 以同时获得该标签。
publishImageMetadata 默认启用。元数据配置或发布失败默认只告警,不会把已成功的推送标记为失败;设置 failOnMetadataPublishError: true 可改为失败。--all-tags 默认跳过元数据发布并告警。
- 元数据会尝试通过
history 提供层信息,运行时不支持时回退到 image inspect;无法完整复现 Docker@2 的旧版 layer 指纹。
- 构建输出的镜像 ID 会以
; 分隔追加到 DOCKER_TASK_BUILT_IMAGES,供后续任务复用;任务还会发布命令、作业 ID 和认证方式的遥测。
- Azure DevOps Server 的镜像详情 API 可用性取决于服务器版本和配置。发布需要 HTTPS;HTTP 地址默认跳过发布并告警,
failOnMetadataPublishError: true 时在推送前报错。服务器的身份联合能力也取决于其版本和配置。
- 运行时命令失败时,错误消息会分别标注标准输出和标准错误,便于定位推送失败原因。
- Buildah 将任务的
build 映射为 buildah bud,支持构建、推送、登录和退出;不支持 start/stop、基础镜像 digest 查询或本任务的镜像详情发布。
- 选择 wslc 时,不支持 Azure Pipelines 代理管理的作业容器或服务容器,也不支持 Docker Compose、Docker API 兼容性或 wslc 不支持的命令。
Azure DevOps Server 的实际安装、代理执行、身份认证及镜像详情 API 尚需在授权的隔离环境中验证。
参考:Docker@2、Podman Windows 安装、nerdctl、Finch、Buildah、WSL 容器。
| |