Azure Pipelines 与 Docker 入门
本指南由社区贡献。Docker 在此感谢 Kristiyan Velkov 的宝贵贡献。
先决条件
在开始之前,请确保您满足以下要求:
- 一个已生成访问令牌的 Docker Hub 账户。
- 一个活跃的 Azure DevOps 项目,并已连接 Git 仓库。
- 一个在其根目录或适当的构建上下文中包含有效
Dockerfile的项目。
概述
本指南将引导您使用 Azure Pipelines 构建和推送 Docker 镜像,为容器化应用程序实现精简且安全的 CI 工作流。您将学习如何:
- 安全地配置 Docker 身份验证。
- 设置自动化管道以构建和推送镜像。
设置 Azure DevOps 以与 Docker Hub 配合使用
步骤 1:配置 Docker Hub 服务连接
要使用 Azure Pipelines 安全地对 Docker Hub 进行身份验证:
- 在您的 Azure DevOps 项目中,导航到 Project Settings > Service Connections。
- 选择 New service connection > Docker Registry。
- 选择 Docker Hub 并提供您的 Docker Hub 凭据或访问令牌。
- 为服务连接指定一个易于识别的名称,例如
my-docker-registry。 - 为提高安全性和遵循最小权限原则,仅授予特定需要的管道访问权限。
重要除非绝对必要,否则避免选择授予所有管道访问权限的选项。始终应用最小权限原则。
步骤 2:创建您的管道
将以下 azure-pipelines.yml 文件添加到您的仓库根目录:
# Trigger pipeline on commits to the main branch
trigger:
- main
# Trigger pipeline on pull requests targeting the main branch
pr:
- main
# Define variables for reuse across the pipeline
variables:
imageName: 'docker.io/$(dockerUsername)/my-image'
buildTag: '$(Build.BuildId)'
latestTag: 'latest'
stages:
- stage: BuildAndPush
displayName: Build and Push Docker Image
jobs:
- job: DockerJob
displayName: Build and Push
pool:
vmImage: ubuntu-latest
demands:
- docker
steps:
- checkout: self
displayName: Checkout Code
- task: Docker@2
displayName: Docker Login
inputs:
command: login
containerRegistry: 'my-docker-registry' # Service connection name
- task: Docker@2
displayName: Build Docker Image
inputs:
command: build
repository: $(imageName)
tags: |
$(buildTag)
$(latestTag)
dockerfile: './Dockerfile'
arguments: |
--sbom=true
--attest type=provenance
--cache-from $(imageName):latest
env:
DOCKER_BUILDKIT: 1
- task: Docker@2
displayName: Push Docker Image
condition: eq(variables['Build.SourceBranch'], 'refs/heads/main')
inputs:
command: push
repository: $(imageName)
tags: |
$(buildTag)
$(latestTag)
# Optional: logout for self-hosted agents
- script: docker logout
displayName: Docker Logout (Self-hosted only)
condition: ne(variables['Agent.OS'], 'Windows_NT')此管道的作用
此管道为主分支自动化了 Docker 镜像的构建和部署过程。它通过缓存、标记和有条件的清理等最佳实践,确保了安全高效的工作流。它的作用如下:
- 在针对
main分支的提交和拉取请求时触发。 - 使用 Azure DevOps 服务连接安全地对 Docker Hub 进行身份验证。
- 使用 Docker BuildKit 构建和标记 Docker 镜像以进行缓存。
- 将 buildId 和 latest 标签都推送到 Docker Hub。
- 如果在自托管的 Linux 代理上运行,则从 Docker 注销。
管道如何工作
步骤 1:定义管道触发器
trigger:
- main
pr:
- main此管道会在以下情况下自动触发:
- 推送到
main分支的提交 - 针对
main分支的拉取请求
提示
步骤 2:定义通用变量
variables:
imageName: 'docker.io/$(dockerUsername)/my-image'
buildTag: '$(Build.BuildId)'
latestTag: 'latest'这些变量确保了在整个管道步骤中命名、版本控制和重用的一致性:
imageName:您在 Docker Hub 上的镜像路径buildTag:每次管道运行的唯一标签latestTag:您最新镜像的稳定别名
重要变量
dockerUsername不会自动设置。
在您的 Azure DevOps 管道变量中安全地设置它:
- 前往 Pipelines > Edit > Variables
- 添加
dockerUsername并填入您的 Docker Hub 用户名
步骤 3:定义管道阶段和作业
stages:
- stage: BuildAndPush
displayName: Build and Push Docker Image此阶段仅在源分支是 main 时执行。
提示
步骤 4:作业配置
jobs:
- job: DockerJob
displayName: Build and Push
pool:
vmImage: ubuntu-latest
demands:
- docker此作业利用了由 Microsoft 托管代理提供的最新 Ubuntu 虚拟机镜像,该镜像支持 Docker。如有需要,可以用自定义池替换为自托管代理。
提示了解更多:在您的管道中指定一个池
步骤 4.1:检出代码
steps:
- checkout: self
displayName: Checkout Code此步骤将您的仓库代码拉取到构建代理中,以便管道可以访问 Dockerfile 和应用程序文件。
提示了解更多:checkout 步骤文档
步骤 4.2:对 Docker Hub 进行身份验证
- task: Docker@2
displayName: Docker Login
inputs:
command: login
containerRegistry: 'my-docker-registry' # Replace with your service connection name使用预先配置的 Azure DevOps Docker 注册表服务连接进行安全身份验证,而无需直接暴露凭据。
提示了解更多:为 Docker Hub 使用服务连接
步骤 4.3:构建 Docker 镜像
- task: Docker@2
displayName: Build Docker Image
inputs:
command: build
repository: $(imageName)
tags: |
$(buildTag)
$(latestTag)
dockerfile: './Dockerfile'
arguments: |
--sbom=true
--attest type=provenance
--cache-from $(imageName):latest
env:
DOCKER_BUILDKIT: 1这将使用以下配置构建镜像:
- 两个标签:一个带有唯一的构建 ID,另一个是 latest
- 启用 Docker BuildKit 以实现更快的构建和高效的层缓存
- 从最近推送的 latest 镜像中拉取缓存
- 软件物料清单 (SBOM) 以实现供应链透明度
- 来源证明,以验证镜像是如何以及在何处构建的
提示
步骤 4.4:推送 Docker 镜像
- task: Docker@2
displayName: Push Docker Image
condition: eq(variables['Build.SourceBranch'], 'refs/heads/main')
inputs:
command: push
repository: $(imageName)
tags: |
$(buildTag)
$(latestTag)通过应用此条件,管道会在每次运行时构建 Docker 镜像以确保及早发现问题,但仅在更改合并到主分支时才将镜像推送到注册表——从而保持您的 Docker Hub 整洁且专注。
这将两个标签都上传到 Docker Hub:
$(buildTag)确保了每次运行的可追溯性。latest用于引用最新镜像。
步骤 4.5 从 Docker 注销(自托管代理)
- script: docker logout
displayName: Docker Logout (Self-hosted only)
condition: ne(variables['Agent.OS'], 'Windows_NT')在管道结束时,在基于 Linux 的自托管代理上执行 docker logout,以主动清理凭据并增强安全态势。
摘要
通过此 Azure Pipelines CI 设置,您可以获得:
- 使用内置服务连接进行安全的 Docker 身份验证。
- 由代码更改触发的自动化镜像构建和标记。
- 利用 Docker BuildKit 缓存进行高效构建。
- 在持久化代理上通过注销进行安全清理。
- 通过 SBOM 和证明构建满足现代软件供应链要求的镜像
了解更多
- Azure Pipelines 文档:在 Azure DevOps 中配置和管理 CI/CD 管道的综合指南。
- Azure Pipelines 的 Docker 任务:在 Azure Pipelines 中使用 Docker 任务构建和推送镜像的详细参考。
- Docker Buildx Bake:探索 Docker 的高级构建工具,用于复杂、多阶段和多平台的构建设置。另请参阅 精通 Buildx Bake 指南 以获取实际示例和最佳实践。
- Docker Build Cloud:了解 Docker 的托管构建服务,用于在云中进行更快、可扩展和多平台的镜像构建。