定義容器作業 (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-2019
和 ubuntu-*
映像支援執行中的容器。
macOS 映像不支援執行中的容器。
單一作業
以下是簡單的範例:
pool:
vmImage: 'ubuntu-latest'
container: ubuntu:18.04
steps:
- script: printenv
這會告訴系統從 Docker Hub 擷取標記的ubuntu
18.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 二進位檔新增至容器。
節點 18 是安全的選擇。
您可以從映像開始 node:18-alpine
。
告訴代理程式Node.js
代理程式會讀取容器捲標 「com.azure.dev.pipelines.handler.node.path」。。
如果此標籤存在,它必須是Node.js二進位檔的路徑。
例如,在以 為基礎的 node:18-alpine
映射中,將這一行新增至您的 Dockerfile:
LABEL "com.azure.dev.pipelines.agent.handler.node.path"="/usr/local/bin/node"
新增需求
Azure Pipelines 假設已安裝一般系統套件的Bash型系統。
Alpine Linux 特別沒有隨附數個所需的套件。
安裝 bash
、 sudo
和 shadow
將涵蓋基本需求。
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_CONFIG
。 DOCKER_CONFIG
匯出每個代理程式集區 runsvc.sh 文稿中的 :
#insert anything to set up env when running as a service
export DOCKER_CONFIG=./.docker
意見反應
https://aka.ms/ContentUserFeedback。
即將登場:在 2024 年,我們將逐步淘汰 GitHub 問題作為內容的意見反應機制,並將它取代為新的意見反應系統。 如需詳細資訊,請參閱:提交並檢視相關的意見反應