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、、build、push、 loginlogout在版本 2.173.0 中添加: startstop默认值:30 buildAndPush |
containerRegistry容器注册表 |
可选 | Docker 注册表服务连接的名称。 |
repository存储库 |
可选 | 容器注册表中与指定为输入 containerRegistry的 Docker 注册表服务连接对应的存储库的名称。 前缀为 username/ Docker Hub。 |
container容器 |
命令 start 和 stop |
要启动或停止的容器资源。 |
tagsTags |
可选 | 多行输入,其中每行包含要用于 build、 push或 buildAndPush 命令的标记。默认值:30 $(Build.BuildId) |
DockerfileDockerfile |
可选 | Dockerfile 的路径。 该任务将使用它找到 的第一个 Dockerfile 来生成映像。 默认值:30 **/Dockerfile |
buildContext生成上下文 |
可选 | 生成上下文的路径。 默认值:30 ** |
arguments自变量 |
可选 | 要传递到 Docker 客户端的其他参数。 请注意,如果使用参数的值 buildAndPushcommand,arguments将忽略该属性。 |
addPipelineData 向映像添加管道元数据 |
可选 | 默认情况下会添加源分支名称和生成 ID 等管道数据,这有助于跟踪。 例如,可以检查映像,找出生成映像的管道。 可以选择退出此默认行为。 可能的值: true、false默认值:30 true |
addBaseImageData 向图像添加基本映像元数据 |
可选 | 默认情况下会添加基本映像名称和摘要等基本映像数据,这有助于跟踪。 可以选择退出此默认行为。 可能的值: true、false默认值:30 true |
登录
以下 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 并推送到对应于 dockerRegistryServiceConnection1 和 dockerRegistryServiceConnection2的容器注册表。
如果要生成并推送到特定经过身份验证的容器注册表,而不是同时生成并推送到所有经过身份验证的容器注册表,请指定输入 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) 的便捷命令build,arguments因此忽略此命令的输入。
故障排除
为什么 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 上开放源代码。 欢迎提供反馈和建议。



