生成 Docker 映像并将其发布到 Azure 容器注册表
Azure DevOps Services | Azure DevOps Server 2022
使用 Azure Pipelines,可以设置一个管道工作流来生成 Docker 映像并将其发布到 Azure 容器注册表。 在本文中,你将学习如何:
- 创建 Azure 容器注册表
- 在 Azure VM 上设置自托管代理
- 设置托管服务标识
- 创建 Docker 注册表服务连接
- 生成映像并将其发布到 Azure 容器注册表
先决条件
一个 GitHub 帐户。 如果你没有帐户,可以免费注册一个。
Azure DevOps Projects 中服务连接的管理员角色。
具有活动订阅的 Azure 帐户。 如果你没有帐户,可以免费注册一个。
获取代码
创建示例应用的分支或克隆它,以便能够顺利完成本教程。
https://github.com/MicrosoftDocs/pipelines-javascript-docker
创建 Azure 容器注册表
导航到 Azure 门户。
在左侧导航面板中选择“创建资源”,选择“容器”,然后选择“容器注册表”。
选择你的订阅,然后选择你的资源组或创建一个新资源组。
输入容器注册表的注册表名称。 注册表名称在 Azure 中必须唯一,并且必须至少包含 5 个字符。
选择首选的位置和 SKU,然后选择“查看 + 创建”。
查看设置,查看完后选择“创建”。
设置自托管代理 VM
若要将托管服务标识与 Azure Pipelines 配合使用以将 Docker 映像发布到 Azure 容器注册表,我们必须在 Azure VM 上设置自己的自托管代理。
创建 VM
导航到 Azure 门户。
在左侧导航面板中选择“创建资源”,然后选择“虚拟机”->“创建”。
选择你的订阅,然后选择用来创建容器注册表的资源组。
为虚拟机命名,并选择一个映像。
输入你的用户名和密码,然后选择“查看 + 创建”。
查看设置,查看完后选择“创建”。
完成部署后,选择“转到资源”。
创建代理池
在 Azure DevOps 项目中,选择齿轮图标 导航到“项目设置”。
选择“代理池”,然后选择“添加池”。
选择“新建”,然后从“池类型”下拉菜单中选择“自托管”。
为池指定名称,然后选中“授予对所有管道的访问权限”复选框。
完成操作后,选择“创建”。
现在选择刚刚创建的池,然后选择“新建代理”。
我们将使用此窗口中的说明在前面创建的 VM 中设置代理。 选择“复制”按钮将下载链接复制到剪贴板。
创建个人访问令牌
在 Azure DevOps 项目中选择“用户设置”,然后选择“个人访问令牌”。
选择“新建令牌”以创建新的个人访问令牌。
输入 PAT 的名称,然后选择过期日期。
在“范围”中选择“自定义”,然后选择“显示所有范围”。
选择“代理池”->“读取和管理”,然后选择“部署组”->“读取和管理”。
完成后选择“创建”,并将 PAT 保存在安全位置。
设置自托管代理
在 Azure 门户中连接到你的 VM。
在提升的 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
运行以下命令以提取并创建代理。
mkdir agent ; cd agent Add-Type -AssemblyName System.IO.Compression.FileSystem ; [System.IO.Compression.ZipFile]::ExtractToDirectory("<FILE_PATH>", "$PWD")
运行以下命令以开始配置代理。
.\config.cmd
根据提示输入你的服务器 URL。 示例:https://dev.azure.com/fabrikamFiber
当系统提示选择身份验证类型时,请按 Enter 以选择“PAT”身份验证。
粘贴之前创建的个人访问令牌,然后按 Enter。
输入代理池的名称,然后输入代理名称。
为“工作文件夹”保留默认值,如果你要将代理作为服务运行,请输入“Y”。
现在,代理已准备好开始侦听作业,接下来让我们在 VM 上安装 Docker。 运行以下命令以下载 Docker。
Invoke-WebRequest -URI https://desktop.docker.com/win/main/amd64/Docker%20Desktop%20Installer.exe -OutFile <DOWNLOAD_PATH>
导航到下载路径,然后运行以下命令以安装并启动 Docker。
Start-Process 'Docker%20Desktop%20Installer.exe' -Wait install
现在导航回代理文件夹,并运行 cmd 文件以在 Azure VM 上运行代理。
.\run.cmd
你的代理现在应已在 Azure DevOps 门户中的“代理池”->“代理”中列出。
设置托管标识
在 Azure 门户中,导航到之前创建的 VM。
在左侧导航面板中选择“标识”,然后启用“系统分配的标识”。
完成后选择“保存”,然后确认选择。
选择“Azure 角色分配”,然后选择“添加角色分配”。
从“范围”下拉菜单中选择“资源组”。
选择你的订阅和资源组,然后选择“AcrPush”角色。
重复步骤 5 和 6 以添加 AcrPull 角色。
创建 Docker 注册表服务连接
在 Azure DevOps 项目中,选择齿轮图标 导航到“项目设置”。
在左侧窗格中选择“服务连接”。
选择“新建服务连接”,选择“Docker 注册表”,然后选择“下一步”。
选择“Azure 容器注册表”,然后选择“托管服务标识”作为身份验证类型。
输入你的订阅 ID、订阅名称和 Azure 容器注册表登录服务器。 将在上一步中创建的 VM 系统分配的租户 ID 粘贴到租户 ID 文本字段中。
输入你的服务连接名称,然后选中“授予对所有管道的访问权限”复选框。 需要服务连接管理员角色才能选择此选项。
完成后,选择“保存”。
生成并发布到 Azure 容器注册表
在 Azure DevOps 项目中选择“管道”,然后选择“创建管道”。
选择托管源代码的服务(Azure Repos、GitHub 等)。
选择你的存储库,然后选择“初学者管道”。
删除默认的 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)
管道运行完成后,可以在 Azure 中验证映像。 在 Azure 门户中导航到你的 Azure 容器注册表,然后选择“存储库”。
清理资源
如果你不打算继续使用此应用程序,请删除资源组以避免持续产生费用。
az group delete --name myapp-rg