Azure Pipelines 与 Docker 入门

本指南由社区贡献。Docker 在此感谢 Kristiyan Velkov 的宝贵贡献。

先决条件

在开始之前,请确保您满足以下要求:

概述

本指南将引导您使用 Azure Pipelines 构建和推送 Docker 镜像,为容器化应用程序实现精简且安全的 CI 工作流。您将学习如何:

  • 安全地配置 Docker 身份验证。
  • 设置自动化管道以构建和推送镜像。

设置 Azure DevOps 以与 Docker Hub 配合使用

步骤 1:配置 Docker Hub 服务连接

要使用 Azure Pipelines 安全地对 Docker Hub 进行身份验证:

  1. 在您的 Azure DevOps 项目中,导航到 Project Settings > Service Connections
  2. 选择 New service connection > Docker Registry
  3. 选择 Docker Hub 并提供您的 Docker Hub 凭据或访问令牌。
  4. 为服务连接指定一个易于识别的名称,例如 my-docker-registry
  5. 为提高安全性和遵循最小权限原则,仅授予特定需要的管道访问权限。
重要

除非绝对必要,否则避免选择授予所有管道访问权限的选项。始终应用最小权限原则。

步骤 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 管道变量中安全地设置它:

  1. 前往 Pipelines > Edit > Variables
  2. 添加 dockerUsername 并填入您的 Docker Hub 用户名

了解更多:在 Azure Pipelines 中定义和使用变量

步骤 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 注册表服务连接进行安全身份验证,而无需直接暴露凭据。

提示

步骤 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 和证明构建满足现代软件供应链要求的镜像

了解更多

© . This site is unofficial and not affiliated with Kubernetes or Docker Inc.