使用 Azure Pipelines 生成容器映像并将其推送到注册表

Azure DevOps Services | Azure DevOps Server 2022 | Azure DevOps Server 2020

本文指导你完成使用 Azure Pipelines 生成 Docker 映像并将其推送到 Azure 容器注册表、Docker 中心和 Google Artifact Registry 的设置和配置。 此外,它还详细介绍 System.AccessToken 了如何在管道中使用安全身份验证。

本文指导你完成使用 Azure Pipelines 生成 Docker 映像并将其推送到 Docker 中心和 Google Artifact Registry 的设置和配置。 此外,它还详细介绍 System.AccessToken 了如何在管道中使用安全身份验证。

了解如何创建 YAML 管道,以生成 Docker 映像并将其推送到容器注册表。 Docker@2任务用于生成映像并将其推送到容器注册表。

先决条件

  • 一个 Azure DevOps 项目。
  • 容器注册表(Docker Hub、Google Artifact Registry 或 Azure 容器注册表)。
  • 包含 Dockerfile 的 GitHub 存储库。 如果没有示例存储库,可以使用 示例存储库 在浏览器中,转到示例存储库,然后将其分叉到 GitHub 帐户。
  • Docker。 如果使用自承载代理,请确保已安装 Docker,并使用提升的权限运行 Docker 引擎。 Microsoft托管代理已预安装 Docker。
  • 一个 Azure DevOps 项目。
  • 容器注册表(Docker 中心或 Google Artifact Registry)。
  • 包含 Dockerfile 的 GitHub 存储库。 如果没有示例存储库,可以使用 示例存储库 在浏览器中,转到示例存储库,然后将其分叉到 GitHub 帐户。
  • Docker。 如果使用自承载代理,请确保已安装 Docker,并使用提升的权限运行 Docker 引擎。 Microsoft托管代理已预安装 Docker。

创建 Docker 服务连接

将容器映像推送到注册表之前,需要在 Azure DevOps 中创建服务连接。 此服务连接存储使用容器注册表进行安全身份验证所需的凭据。 转到 Azure DevOps 项目中的服务连接 页,创建新的服务连接并选择 Docker 注册表 连接类型。

为 Docker 中心和 Google Artifact Registry 创建服务连接有不同的过程。

在“Docker 注册表服务连接”下选择“Docker Hub”选项,然后提供你的用户名和密码以创建 Docker 服务连接

创建 Azure Pipeline 以生成和推送 Docker 映像

Docker@2任务旨在简化在 Azure Pipelines 中生成、推送和管理 Docker 映像的过程。 此任务支持各种 Docker 命令,包括生成、推送、登录、注销、启动、停止和运行。

以下步骤概述了如何创建使用Docker@2任务生成和推送映像的 YAML 管道。

  1. 导航到 Azure DevOps 项目,然后 从左侧菜单中选择“管道 ”。

  2. 选择“ 新建管道 ”以创建新管道。

  3. 选择 GitHubGitHub Enterprise Server 作为源代码的位置。

  4. 如果尚未这样做,请授权 Azure Pipelines 连接到 GitHub Enterprise Server 帐户。

    1. 选择连接到 GitHub Enterprise Server
    2. 输入帐户详细信息,然后选择“验证并保存”
  5. 选择存储库。 如果重定向到 GitHub

  6. 选择 初学者管道 模板以创建基本管道配置。

  7. 将 azure-pipelines.yml 的内容替换为以下代码。

  8. 根据部署的是 Linux 还是 Windows 应用,确保分别将 vmImage 设置为 ubuntu-latestwindows-latest。 如果使用自承载代理,请设置为 vmImage 包含具有 Docker 功能的自承载代理的池的名称。 可以添加该 demands: docker 属性,以确保选择了安装了 Docker 的代理。

  9. 替换为 <docker connection> 前面创建的 Docker 服务连接的名称。

  10. 替换为 <target repository name> 要在其中推送映像的容器注册表中的存储库的名称。 例如,<your-docker-hub-username>/<repository-name>

    
     trigger:
     - main
    
     pool:
     vmImage: 'ubuntu-latest' 
    
     variables:
     repositoryName: '<target repository name>'
    
     steps:
     - task: Docker@2
     inputs:
     containerRegistry: '<docker connection>'
     repository: $(repositoryName)
     command: 'buildAndPush'
     Dockerfile: '**/Dockerfile'
    
    
  11. 完成后,选择“保存并运行”。

  12. azure-pipelines.yml文件保存到存储库时,系统会提示添加提交消息。 输入消息,然后选择“保存并运行”

使用自托管代理时,请确保代理的主机上已安装 Docker,并且 Docker 引擎/守护程序正在使用提升的权限运行。

若要生成映像,必须在代理的主机上安装 Docker,并且 Docker 引擎/守护程序必须以提升的权限运行。 使用以下步骤使用 YAML 管道编辑器创建管道。

  1. 转到集合,并创建项目。

  2. 在项目中,选择“管道”

  3. 选择 Create Pipeline

  4. 选择 GitHub Enterprise Server 作为源代码的位置。

  5. 如果尚未这样做,请授权 Azure Pipelines 连接到 GitHub Enterprise Server 帐户。

    1. 选择连接到 GitHub Enterprise Server
    2. 输入帐户详细信息,然后选择“验证并保存”
  6. 选择存储库。 如果你已重定向到 GitHub 来安装 Azure Pipelines 应用,请选择“批准并安装”。

  7. 若要配置管道,请选择“生成 Docker 映像”模板。

  8. 在 YAML 管道编辑器中,将 YAML 文件的内容替换为以下代码。 将池名称替换为包含具有 Docker 功能的自托管代理的池的名称。

  9. 根据部署的是 Linux 还是 Windows 应用,确保分别将 vmImage 设置为 ubuntu-latestwindows-latest

  10. 替换为 <target repository name> 要在其中推送映像的容器注册表中的存储库的名称。 例如,<your-docker-hub-username>/<repository-name>

  11. 替换为 <docker connection> 前面创建的 Docker 服务连接的名称。

    
    trigger:
    - main
    
    pool:
    name: default
    demands: docker
    
    variables:
    repositoryName: '<target repository name>'
    
    steps:
    - task: Docker@2
    inputs:
    containerRegistry: '<docker connection>'
    repository: $(repositoryName)
    command: 'buildAndPush'
    Dockerfile: '**/Dockerfile'
    
    
  12. 选择保存并运行

  13. 在“保存并运行”页面上,再次选择“保存并运行”

可以监视管道运行并查看日志,以查看正在生成并推送到容器注册表的 Docker 映像。

在 Docker@2 任务中使用 System.AccessToken 进行身份验证

可以使用 Azure DevOps 提供的容器注册表 System.AccessToken 进行身份验证。 此令牌允许安全访问管道中的资源,而无需公开敏感凭据。

以下 YAML 管道示例,Docker@2任务用于登录到容器注册表并推送 Docker 映像。 设置为 System.AccessToken 环境变量以对 Docker 命令进行身份验证。

替换为 <docker connection> Docker 注册表服务连接名称。 替换为 <your repository> Docker 存储库的名称。

trigger:
- main

pool:
  vmImage: 'ubuntu-latest'

variables:
  SYSTEM_ACCESSTOKEN: $(System.AccessToken)

steps:
- task: Docker@2
  inputs:
    command: login
    containerRegistry: '<docker connection>'
  env:
    SYSTEM_ACCESSTOKEN: $(System.AccessToken)

- task: Docker@2
  inputs:
    command: buildAndPush
    repository: '<your repository>'
    dockerfile: '**/Dockerfile'
    tags: |
      $(Build.BuildId)
  env:
    SYSTEM_ACCESSTOKEN: $(System.AccessToken)