快速入门:使用 Azure Pipelines 生成容器映像以部署应用

Azure DevOps Services

本快速入门介绍如何使用 Azure Pipelines 为应用部署生成容器映像。 只需存储库中有一个 Dockerfile 即可生成此映像。 可以根据管道中使用的代理生成 Linux 或 Windows 容器。

先决条件

  • 具有活动订阅的 Azure 帐户。 免费创建帐户
  • 一个 GitHub 帐户。 如果你没有帐户,可免费注册一个。
  • 安装了 Docker 的 Azure 管道 Windows 或 Linux 代理。

创建示例存储库分支

在浏览器中,转到以下示例存储库,并将其分支到 GitHub 帐户。

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

生成 Linux 或 Windows 映像

  1. 登录到你的 Azure DevOps 组织,并转到你的项目。

  2. 转到“管道”,如果在项目中创建第一个管道,请选择“新建管道”或“创建管道”

  3. 选择“GitHub”作为源代码位置。

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

    • 如果你已重定向到 GitHub 进行登录,请输入 GitHub 凭据。
    • 如果你已重定向到 GitHub 来安装 Azure Pipelines 应用,请选择“批准并安装”。
  5. 将 azure-pipelines.yml 的内容替换为以下代码。 根据部署的是 Linux 还是 Windows 应用,确保分别将 vmImage 设置为 ubuntu-latestwindows-latest

     trigger:
     - main
    
     pool:
       vmImage: 'ubuntu-latest' 
    
     variables:
       imageName: 'pipelines-javascript-docker'
    
     steps:
     - task: Docker@2
       displayName: Build an image
       inputs:
         repository: $(imageName)
         command: build
         Dockerfile: app/Dockerfile
    
  6. 完成后,选择“保存并运行”。

  7. 将 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 功能的自托管代理的池的名称。
# Docker
# Build a Docker image
# https://docs.microsoft.com/azure/devops/pipelines/languages/docker

trigger:
- main

pool:
  name: default
  demands: docker

variables:
  imageName: 'pipelines-javascript-docker'

steps:
 - task: Docker@2
   displayName: Build an image
   inputs:
     repository: $(imageName)
     command: build
     Dockerfile: '$(Build.SourcesDirectory)/app/Dockerfile'

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

有关生成 Docker 映像的详细信息,请参阅此示例应用程序使用的 Docker 任务。 也可以使用命令行任务直接调用 Docker 命令。

容器映像将构建并存储在代理上。 可以将映像推送到 Google Container Registry、Docker Hub 或 Azure 容器注册表。 有关详细信息,请参阅将映像推送到 Docker Hub 或 Google Container Registry,或将映像推送到 Azure 容器注册表

清理资源

如果你不打算继续使用此应用程序,请删除管道和代码存储库。

常见问题解答

可以使用哪些代理来生成容器映像?

  • 可以使用 Microsoft 托管的 Ubuntu 代理或基于 Linux 平台的自托管代理生成 Linux 容器映像。

  • 可以使用 Microsoft 托管的 Windows 代理或基于 Windows 平台的自托管代理生成 Windows 容器映像。 所有 Microsoft 托管的基于 Windows 平台的代理都附带 Docker 生成所需的 Moby 引擎和客户端。

  • 目前无法使用 Microsoft 托管的 macOS 代理来生成容器映像,因为生成映像所需的 Moby 引擎未预安装在这些代理上。

有关详细信息,请参阅 Microsoft 托管的代理可用的 Windows 和 Linux 代理选项

托管代理上提供哪些预缓存的 Docker 映像?

为了避免花费较长的时间间隔从容器注册表中拉取每个作业的 Docker 映像,一些常用映像预缓存在 Microsoft 托管的代理上。 有关可用预缓存映像的列表,请参阅 azure-pipelines-image-generation 存储库中可用 VM 映像的随附软件

如何为 Docker 生成设置 BuildKit 变量?

BuildKit 在生成的性能、存储管理、特性/功能和安全性方面做出了改进。 Windows 主机目前不支持 BuildKit。

若要使用 BuildKit 启用 Docker 生成,请设置 DOCKER_BUILDKIT 变量。

trigger:
- main
   
pool:
  vmImage: 'ubuntu-latest'
   

variables:
  imageName: 'pipelines-javascript-docker'
  DOCKER_BUILDKIT: 1
    
steps:
- task: Docker@2
  displayName: Build an image
  inputs:
    repository: $(imageName)
    command: build
    Dockerfile: app/Dockerfile

如何使用自托管代理?

必须安装 Docker,并且引擎/守护程序必须在代理的主机上运行。 如果未在代理的主机上安装 Docker,请将 Docker 安装程序任务添加到管道。 必须在 Docker 任务之前添加 Docker 安装程序任务

如何创建基于脚本的 Docker 生成而不使用 Docker 任务?

可以使用 build 命令或任何其他 Docker 命令。

docker build -f Dockerfile -t foobar.azurecr.io/hello:world .

此命令创建一个与使用 Docker 任务生成的映像等效的映像。 在内部,Docker 任务会调用脚本中的 Docker 二进制文件,并将其他几个命令拼结在一起以额外提供几项优势。 详细了解 Docker 任务

是否可以在 Azure Pipelines 上生成期间重用层缓存?

如果使用 Microsoft 托管的代理,则会根据从 azure-pipelines-image-generation 存储库模板生成的映像将每个作业分派到新预配的虚拟机。 该作业完成后,将清理这些虚拟机。 这种短暂的生存期会阻止将这些虚拟机重用于后续作业,并会阻止重用缓存的 Docker 层。 解决方法是设置一个多阶段生成,以生成两个映像并在早期阶段将其推送到映像注册表。 然后,可以使用 --cache-from 参数告知 Docker 使用这些映像作为缓存源。

如果使用自托管代理,则无需采用任何解决方法即可缓存 Docker 层,因为短暂的生存期问题不适用于这些代理。

如何为 x64 以外的体系结构生成 Linux 容器映像?

当你使用 Microsoft 托管的 Linux 代理时,会为 x64 体系结构创建 Linux 容器映像。 若要为其他体系结构(如 x86 或 ARM 处理器)创建映像,可以使用 QEMU 等计算机仿真器。

以下步骤说明如何使用 QEMU 创建 ARM 处理器容器映像:

  1. 使用与目标体系结构匹配的基础映像创建 Dockerfile:

    FROM arm64v8/alpine:latest
    
  2. 生成映像之前,在作业中运行以下脚本:

    # register QEMU binary - this can be done by running the following image
    docker run --rm --privileged multiarch/qemu-user-static --reset -p yes
    # build your image
    

有关详细信息,请参阅 GitHub 上的 qemu-user-static

如何针对容器化应用程序运行测试并发布测试结果?

有关测试容器化应用程序和发布结果测试结果的不同选项,请参阅发布测试结果任务

后续步骤

生成容器映像后,将映像推送到 Azure 容器注册表、Docker Hub 或 Google 容器注册表。 若要了解如何将映像推送到容器注册表,请继续阅读以下文章: