Docker 任务

Azure DevOps Services | Azure DevOps Server 2020 | Azure DevOps Server 2019 | TFS 2018

使用此任务通过 Docker 注册表服务连接生成 Docker 映像并将其推送到任何容器注册表。

概述

下面是与在脚本中使用 Docker 客户端二进制文件相比,使用 Docker 任务的主要优势:

  • 与 Docker 注册表服务连接集成。 通过此任务,可以轻松使用 Docker 注册表服务连接连接到任何容器注册表。 登录后,可以使用 Docker 任务已完成的登录名创作后续任务来运行任何任务或脚本。 例如,可以使用 Docker 任务登录到任何容器注册表,然后使用后续任务或脚本生成映像并将其推送到此注册表。

  • 添加为标签的元数据。 该任务以以下标签的形式将可追溯性相关元数据添加到图像中:

    • com.azure.dev.image.build.buildnumber
    • com.azure.dev.image.build.builduri
    • com.azure.dev.image.build.definitionname
    • com.azure.dev.image.build.repository.name
    • com.azure.dev.image.build.repository.uri
    • com.azure.dev.image.build.sourcebranchname
    • com.azure.dev.image.build.sourceversion
    • com.azure.dev.image.release.definitionname
    • com.azure.dev.image.release.releaseid
    • com.azure.dev.image.release.releaseweburl
    • com.azure.dev.image.system.teamfoundationcollectionuri
    • com.azure.dev.image.system.teamproject

任务输入

参数 必需还是可选 说明
command
命令
必需 可能的值:buildAndPush、、buildpushloginlogout
在版本 2.173.0 中添加: startstop
默认值:30buildAndPush
containerRegistry
容器注册表
可选 Docker 注册表服务连接的名称。
repository
存储库
可选 容器注册表中与指定为输入 containerRegistry的 Docker 注册表服务连接对应的存储库的名称。 前缀为 username/ Docker Hub。
container
容器
命令 startstop 要启动或停止的容器资源。
tags
Tags
可选 多行输入,其中每行包含要用于 buildpushbuildAndPush 命令的标记。
默认值:30$(Build.BuildId)
Dockerfile
Dockerfile
可选 Dockerfile 的路径。 该任务将使用它找到 的第一个 Dockerfile 来生成映像。
默认值:30**/Dockerfile
buildContext
生成上下文
可选 生成上下文的路径。
默认值:30**
arguments
自变量
可选 要传递到 Docker 客户端的其他参数。
请注意,如果使用参数的值buildAndPushcommandarguments将忽略该属性。
addPipelineData
向映像添加管道元数据
可选 默认情况下会添加源分支名称和生成 ID 等管道数据,这有助于跟踪。 例如,可以检查映像,找出生成映像的管道。 可以选择退出此默认行为。
可能的值:truefalse
默认值:30true
addBaseImageData
向图像添加基本映像元数据
可选 默认情况下会添加基本映像名称和摘要等基本映像数据,这有助于跟踪。 可以选择退出此默认行为。
可能的值:truefalse
默认值:30true

登录

以下 YAML 代码片段展示了使用 Docker 注册表服务连接的容器注册表登录名:

- task: Docker@2
  displayName: Login to ACR
  inputs:
    command: login
    containerRegistry: dockerRegistryServiceConnection1

生成并推送

调用 buildAndPush 的便利命令允许在单个命令中生成映像并将其推送到容器注册表。 以下 YAML 代码片段是生成映像的多个标记并将其推送到多个注册表的示例:

steps:
- task: Docker@2
  displayName: Login to ACR
  inputs:
    command: login
    containerRegistry: dockerRegistryServiceConnection1
- task: Docker@2
  displayName: Login to Docker Hub
  inputs:
    command: login
    containerRegistry: dockerRegistryServiceConnection2
- task: Docker@2
  displayName: Build and Push
  inputs:
    command: buildAndPush
    repository: contosoRepository # username/contosoRepository for  
    tags: |
      tag1
      tag2

在前面的代码片段中,映像 contosoRepository:tag1 生成 contosoRepository:tag2 并推送到对应于 dockerRegistryServiceConnection1dockerRegistryServiceConnection2的容器注册表。

如果要生成并推送到特定经过身份验证的容器注册表,而不是同时生成并推送到所有经过身份验证的容器注册表,请指定输入 containerRegistry 以及 command: buildAndPush

steps:
- task: Docker@2
  displayName: Build and Push
  inputs:
    command: buildAndPush
    containerRegistry: dockerRegistryServiceConnection1
    repository: contosoRepository
    tags: |
      tag1
      tag2

Logout

以下 YAML 代码片段展示了使用 Docker 注册表服务连接的容器注册表注销:

- task: Docker@2
  displayName: Logout of ACR
  inputs:
    command: logout
    containerRegistry: dockerRegistryServiceConnection1

启动/停止

可以使用启动/停止任务来控制作业和服务容器。 这种用法不常见,但适用于独特的情况。

resources:
  containers:
  - container: builder
    image: ubuntu:18.04
steps:
- script: echo "I can run inside the container (it starts by default)"
  target:
    container: builder
- task: Docker@2
  inputs:
    command: stop
    container: builder
# Any task beyond this point would not be able to target the builder container
# because it has been stopped

其他命令和参数

可以使用命令和参数输入通过 Docker 客户端二进制文件传递生成或推送命令的其他参数:

steps:
- task: Docker@2
  displayName: Login to ACR
  inputs:
    command: login
    containerRegistry: dockerRegistryServiceConnection1
- task: Docker@2
  displayName: Build
  inputs:
    command: build
    repository: contosoRepository # username/contosoRepository for Docker Hub
    tags: tag1
    arguments: --secret id=mysecret,src=mysecret.txt

注意

参数的输入针对除 之外 buildAndPush的所有命令求值。 由于buildAndPush是 (后跟push) 的便捷命令buildarguments因此忽略此命令的输入。

故障排除

为什么 Docker 任务忽略传递给 buildAndPush 命令的参数?

使用 buildAndPush 命令配置的 Docker 任务会忽略传递的参数,因为它们对内部运行的生成和推送命令不明确。 可以将命令拆分为单独的生成和推送步骤,并传递合适的参数。 有关示例,请参阅 此 Stack Overflow 文章

Docker V2 支持 Docker 注册表服务连接,但不支持 Azure 资源管理器服务连接。 如何在 Docker 任务中使用现有的 Azure 服务主体名称进行身份验证?

可以使用 Azure 服务主体名称 (SPN) 凭据创建 Docker 注册表服务连接。 从注册表类型中选择“其他项”,并提供详细信息,如下所示:

Docker Registry:    Your container registry URL (for example, https://myacr.azurecr.io)
Docker ID:          Service principal client ID
Password:           Service principal key

开源

此任务在 GitHub 上开放源代码。 欢迎提供反馈和建议。