定義容器作業 (YAML)

Azure DevOps Services |Azure DevOps Server 2022 - Azure DevOps Server 2019

根據預設,作業會在安裝代理程式的主計算機上執行。 這很方便,而且通常很適合剛開始採用 Azure Pipelines 的專案。 經過一段時間,您可能會發現您想要更充分掌控工作執行的內容。 YAML 管線提供此控制層級的容器作業。

在Linux和 Windows 代理程式上,作業可能會在主機上容器中執行。 (在macOS和 Red Hat Enterprise Linux 6 上,無法使用容器作業。容器提供與主機的隔離,並可讓您釘選特定版本的工具和相依性。 主機作業需要較少的初始設定和基礎結構才能維護。

容器透過主機作業系統提供輕量型抽象概念。 您可以選取組建所需的確切作業系統、工具和相依性版本。 當您在管線中指定容器時,代理程式會先擷取並啟動容器。 然後,作業的每個步驟都會在容器內執行。 您無法有巢狀容器。 當代理程式已經在容器內執行時,不支援容器。

如果您需要個別步驟層級的精細控制, 步驟目標 可讓您為每個步驟選擇容器或主機。

需求

以 Linux 為基礎的容器

Azure Pipelines 系統在以 Linux 為基礎的容器中需要一些事項:

  • Bash
  • 以 glibc 為基礎的
  • 可以執行 Node.js (代理程式所提供的)
  • 未定義 ENTRYPOINT
  • USER 沒有許可權命令 groupadd 的存取權和其他許可權命令 sudo

在代理程式主機上:

  • 確定已安裝 Docker
  • 代理程式必須具有存取 Docker 精靈的許可權

請確定您的容器有每個可用的工具。 Docker Hub 上提供的一些已去除容器,尤其是以 Alpine Linux 為基礎的容器,不符合這些最低需求。 具有的 ENTRYPOINT 容器可能無法運作,因為 Azure Pipelines 會 docker create 是等候的容器和 docker exec 一系列命令,預期容器一律會啟動並執行。

注意

針對以 Windows 為基礎的 Linux 容器,必須預安裝 Node.js。

Windows 容器

Azure Pipelines 也可以執行 Windows 容器需要 Windows Server 版本 1803 或更高版本。 必須安裝 Docker。 請確定您的管線代理程式有權存取 Docker 精靈。

Windows 容器必須支持執行 Node.js。 執行 Node 所需的基底 Windows Nano Server 容器缺少相依性。

裝載 Agent

只有 windows-2019ubuntu-* 映像支援執行中的容器。 macOS 映像不支援執行中的容器。

單一作業

簡單的範例:

pool:
  vmImage: 'ubuntu-latest'

container: ubuntu:18.04

steps:
- script: printenv

這會告訴系統從 Docker Hub 擷取標記的ubuntu18.04映像,然後啟動容器。 printenv當命令執行時,它會在容器內ubuntu:18.04發生。

Windows 範例:

pool:
  vmImage: 'windows-2019'

container: mcr.microsoft.com/windows/servercore:ltsc2019

steps:
- script: set

注意

Windows 需要主機和容器的核心版本相符。 由於此範例使用 Windows 2019 映射,因此我們將使用 2019 容器的標記。

多個作業

容器也適用於在多個 作業中執行相同步驟。 在下列範例中,相同的步驟會在多個 Ubuntu Linux 版本中執行。 (而且我們不必提及 jobs 關鍵詞,因為只定義了單一作業。

pool:
  vmImage: 'ubuntu-latest'

strategy:
  matrix:
    ubuntu16:
      containerImage: ubuntu:16.04
    ubuntu18:
      containerImage: ubuntu:18.04
    ubuntu20:
      containerImage: ubuntu:20.04

container: $[ variables['containerImage'] ]

steps:
- script: printenv

端點

容器可以裝載於公用 Docker Hub 登錄以外的登錄上。 若要在 Azure Container Registry 或其他私人容器登錄上裝載映像(包括私人 Docker Hub 登錄),請將服務連線新增至私人登錄。 然後,您可以在容器規格中參考它:

container:
  image: registry:ubuntu1804
  endpoint: private_dockerhub_connection

steps:
- script: echo hello

container:
  image: myprivate.azurecr.io/windowsservercore:1803
  endpoint: my_acr_connection

steps:
- script: echo hello

其他容器登錄也可以運作。 Amazon ECR 目前無法運作,因為將 AWS 認證轉換成 Docker 可用來驗證的其他用戶端工具。

注意

Red Hat Enterprise Linux 6 組建的代理程式不會執行容器作業。 選擇其他Linux類別,例如 Red Hat Enterprise Linux 7 或更新版本。

選項。

如果您需要控制容器啟動,您可以指定 options

container:
  image: ubuntu:18.04
  options: --hostname container-test --ip 192.168.0.1

steps:
- script: echo hello

執行 docker create --help 會提供可傳遞至 Docker 呼叫的選項清單。 並非所有這些選項都保證可與 Azure DevOps 搭配使用。 請先檢查您是否可以使用容器屬性來完成相同的目標。 如需詳細資訊,請參閱 resources.containers.container YAML 架構docker create命令參考。

可重複使用的容器定義

在下列範例中,容器定義於 resources 區段中。 稍後會參考每個容器,方法是參考其指派的別名。 (在這裡,我們明確列出 jobs 關鍵詞,以清楚起見。

resources:
  containers:
  - container: u16
    image: ubuntu:16.04

  - container: u18
    image: ubuntu:18.04

  - container: u20
    image: ubuntu:20.04

jobs:
- job: RunInContainer
  pool:
    vmImage: 'ubuntu-latest'

  strategy:
    matrix:
      ubuntu16:
        containerResource: u16
      ubuntu18:
        containerResource: u18
      ubuntu20:
        containerResource: u20

  container: $[ variables['containerResource'] ]

  steps:
  - script: printenv

非 glibc 型容器

Azure Pipelines 代理程式提供 Node.js 的複本,這是執行工作和腳本所需的複本。 若要瞭解託管代理程式的 Node.js 版本,請參閱 Microsoft 裝載的代理程式。 Node.js 的版本會針對我們在託管雲端中使用的 C 運行時間進行編譯,通常是 glibc。 Linux 的某些變體會使用其他 C 運行時間。 例如,Alpine Linux 會使用 musl。

如果您想要使用非 glibc 型容器做為作業容器,您必須自行安排一些專案。 首先,您必須提供自己的 Node.js 複本。 其次,您必須將標籤新增至映像,告知代理程式要在哪裡找到 Node.js 二進位檔。 最後,Stock Alpine 不會隨附 Azure Pipelines 相依於的其他相依性:bash、sudo 和 groupadd。

自備 Node.js

您必須負責將 Node 二進位檔新增至容器。 節點 14 是安全的選擇。 您可以從映像開始 node:14-alpine

告訴代理程式 Node.js

代理程式會讀取容器捲標 「com.azure.dev.pipelines.handler.node.path」。。 如果此標籤存在,它必須是 Node.js 二進位檔的路徑。 例如,在以 為基礎的 node:10-alpine映射中,將這一行新增至您的 Dockerfile:

LABEL "com.azure.dev.pipelines.agent.handler.node.path"="/usr/local/bin/node"

新增需求

Azure Pipelines 假設已安裝一般系統套件的Bash型系統。 Alpine Linux 特別沒有隨附數個所需的套件。 安裝 bashsudoshadow 將涵蓋基本需求。

RUN apk add bash sudo shadow

如果您相依於任何內建或 Marketplace 工作,您也需要提供所需的二進位檔。

Dockerfile 的完整範例

FROM node:10-alpine

RUN apk add --no-cache --virtual .pipeline-deps readline linux-pam \
  && apk add bash sudo shadow \
  && apk del .pipeline-deps

LABEL "com.azure.dev.pipelines.agent.handler.node.path"="/usr/local/bin/node"

CMD [ "node" ]

單一裝載代理程式上具有代理程式集區的多個作業

容器作業會使用基礎主機代理程式 Docker config.json 進行映像登錄授權,這會在 Docker 登錄容器初始化結束時註銷。 後續登錄映像提取授權可能會被拒絕進行「未經授權的驗證」,因為已在系統中註冊以進行驗證的 Docker config.json 檔案已由另一個平行執行的容器作業註銷。

解決方案是設定裝載代理程式上所執行之每個代理程式集區服務專屬的 Docker 環境變數 DOCKER_CONFIGDOCKER_CONFIG匯出每個代理程式集區 runsvc.sh 文稿中的 :

#insert anything to set up env when running as a service
export DOCKER_CONFIG=./.docker