生成 Docker 映像并将其发布到 Azure 容器注册表

Azure DevOps Services | Azure DevOps Server 2022

使用 Azure Pipelines,可以设置一个管道工作流来生成 Docker 映像并将其发布到 Azure 容器注册表。 在本文中,你将学习如何:

  • 创建 Azure 容器注册表
  • 在 Azure VM 上设置自托管代理
  • 设置托管服务标识
  • 创建 Docker 注册表服务连接
  • 生成映像并将其发布到 Azure 容器注册表

先决条件

获取代码

创建示例应用的分支或克隆它,以便能够顺利完成本教程。

https://github.com/MicrosoftDocs/pipelines-javascript-docker

创建 Azure 容器注册表

  1. 导航到 Azure 门户

  2. 在左侧导航面板中选择“创建资源”,选择“容器”,然后选择“容器注册表”。

  3. 选择你的订阅,然后选择你的资源组或创建一个新资源组。

  4. 输入容器注册表的注册表名称。 注册表名称在 Azure 中必须唯一,并且必须至少包含 5 个字符。

  5. 选择首选的位置和 SKU,然后选择“查看 + 创建”。

  6. 查看设置,查看完后选择“创建”。

设置自托管代理 VM

若要将托管服务标识与 Azure Pipelines 配合使用以将 Docker 映像发布到 Azure 容器注册表,我们必须在 Azure VM 上设置自己的自托管代理。

创建 VM

  1. 导航到 Azure 门户

  2. 在左侧导航面板中选择“创建资源”,然后选择“虚拟机”->“创建”。

  3. 选择你的订阅,然后选择用来创建容器注册表的资源组。

  4. 为虚拟机命名,并选择一个映像。

  5. 输入你的用户名和密码,然后选择“查看 + 创建”。

  6. 查看设置,查看完后选择“创建”。

  7. 完成部署后,选择“转到资源”。

创建代理池

  1. 在 Azure DevOps 项目中,选择齿轮图标 齿轮图标 导航到“项目设置”。

  2. 选择“代理池”,然后选择“添加池”。

  3. 选择“新建”,然后从“池类型”下拉菜单中选择“自托管”。

  4. 为池指定名称,然后选中“授予对所有管道的访问权限”复选框。

  5. 完成操作后,选择“创建”

  6. 现在选择刚刚创建的池,然后选择“新建代理”。

  7. 我们将使用此窗口中的说明在前面创建的 VM 中设置代理。 选择“复制”按钮将下载链接复制到剪贴板。

    显示如何设置代理的屏幕截图。

创建个人访问令牌

  1. 在 Azure DevOps 项目中选择“用户设置”,然后选择“个人访问令牌”。

  2. 选择“新建令牌”以创建新的个人访问令牌。

  3. 输入 PAT 的名称,然后选择过期日期。

  4. 在“范围”中选择“自定义”,然后选择“显示所有范围”。

  5. 选择“代理池”->“读取和管理”,然后选择“部署组”->“读取和管理”

  6. 完成后选择“创建”,并将 PAT 保存在安全位置。

设置自托管代理

  1. 在 Azure 门户中连接到你的 VM。

  2. 在提升的 PowerShell 命令提示符下,运行以下命令以下载代理。

    Invoke-WebRequest -URI <YOUR_AGENT_DOWNLOAD_LINK> -UseBasicParsing  -OutFile <FILE_PATH> 
    ##Example: Invoke-WebRequest -URI https://vstsagentpackage.azureedge.net/agent/2.213.2/vsts-agent-win-x64-2.213.2.zip -OutFile C:\vsts-agent-win-x64-2.213.2.zip
    
  3. 运行以下命令以提取并创建代理。

    mkdir agent ; cd agent
    Add-Type -AssemblyName System.IO.Compression.FileSystem ; [System.IO.Compression.ZipFile]::ExtractToDirectory("<FILE_PATH>", "$PWD")
    
  4. 运行以下命令以开始配置代理。

    .\config.cmd
    
  5. 根据提示输入你的服务器 URL。 示例:https://dev.azure.com/fabrikamFiber

  6. 当系统提示选择身份验证类型时,请按 Enter 以选择“PAT”身份验证。

  7. 粘贴之前创建的个人访问令牌,然后按 Enter。

  8. 输入代理池的名称,然后输入代理名称。

  9. 为“工作文件夹”保留默认值,如果你要将代理作为服务运行,请输入“Y”。

    显示如何在 Azure VM 上设置代理的屏幕截图。

  10. 现在,代理已准备好开始侦听作业,接下来让我们在 VM 上安装 Docker。 运行以下命令以下载 Docker。

    Invoke-WebRequest -URI https://desktop.docker.com/win/main/amd64/Docker%20Desktop%20Installer.exe -OutFile <DOWNLOAD_PATH>
    
  11. 导航到下载路径,然后运行以下命令以安装并启动 Docker。

    Start-Process 'Docker%20Desktop%20Installer.exe' -Wait install
    
  12. 现在导航回代理文件夹,并运行 cmd 文件以在 Azure VM 上运行代理。

    .\run.cmd
    
  13. 你的代理现在应已在 Azure DevOps 门户中的“代理池”->“代理”中列出。

    显示代理已在代理选项卡中列出的屏幕截图。

设置托管标识

  1. 在 Azure 门户中,导航到之前创建的 VM。

  2. 在左侧导航面板中选择“标识”,然后启用“系统分配的标识”。

  3. 完成后选择“保存”,然后确认选择。

    显示如何启用系统分配的标识的屏幕截图。

  4. 选择“Azure 角色分配”,然后选择“添加角色分配”。

  5. 从“范围”下拉菜单中选择“资源组”。

  6. 选择你的订阅和资源组,然后选择“AcrPush”角色。

  7. 重复步骤 5 和 6 以添加 AcrPull 角色。

    显示如何设置 acrpull 和推送角色的屏幕截图。

创建 Docker 注册表服务连接

  1. 在 Azure DevOps 项目中,选择齿轮图标 齿轮图标 导航到“项目设置”。

  2. 在左侧窗格中选择“服务连接”。

  3. 选择“新建服务连接”,选择“Docker 注册表”,然后选择“下一步”。

  4. 选择“Azure 容器注册表”,然后选择“托管服务标识”作为身份验证类型。

  5. 输入你的订阅 ID订阅名称Azure 容器注册表登录服务器。 将在上一步中创建的 VM 系统分配的租户 ID 粘贴到租户 ID 文本字段中。

  6. 输入你的服务连接名称,然后选中“授予对所有管道的访问权限”复选框。 需要服务连接管理员角色才能选择此选项。

  7. 完成后,选择“保存”。

    显示如何设置 docker 注册表服务连接 MSI 的屏幕截图。

生成并发布到 Azure 容器注册表

  1. 在 Azure DevOps 项目中选择“管道”,然后选择“创建管道”。

  2. 选择托管源代码的服务(Azure Repos、GitHub 等)。

  3. 选择你的存储库,然后选择“初学者管道”。

  4. 删除默认的 yaml 管道并使用以下代码片段:

    trigger:
    - main
    
    variables:
      dockerRegistryServiceConnection: '<SERVICE_CONNECTION_NAME>'
      imageRepository: '<IMAGE_NAME>'
      dockerfilePath: '$(Build.SourcesDirectory)/app/Dockerfile'
      tag: '$(Build.BuildId)'
    
    stages:
    - stage: Build
      displayName: Build and publish stage
      jobs:
      - job: Build
        displayName: Build job
        pool:
          name: '<YOUR_AGENT_POOL_NAME>'
        steps:
        - task: DockerInstaller@0
          inputs:
            dockerVersion: '17.09.0-ce'
    
        - task: Docker@2
          displayName: Build and publish image to Azure Container Registry
          inputs:
            command: buildAndPush
            containerRegistry: $(dockerRegistryServiceConnection)
            repository: $(imageRepository)
            dockerfile: $(dockerfilePath)
            tags: |
              $(tag)
    
  5. 管道运行完成后,可以在 Azure 中验证映像。 在 Azure 门户中导航到你的 Azure 容器注册表,然后选择“存储库”。

    显示 Azure 门户中的映像的屏幕截图。

清理资源

如果你不打算继续使用此应用程序,请删除资源组以避免持续产生费用。

az group delete --name myapp-rg