使用 Docker 簡介 Azure Pipelines
本指南由社群貢獻。Docker 感謝 Kristiyan Velkov 的寶貴貢獻。
先決條件
開始之前,請確保您已具備以下必要條件
- 一個擁有存取權杖的 Docker Hub 帳戶。
- 一個已連線至 Git 儲存庫的活躍 Azure DevOps 專案。
- 一個在根目錄包含有效
Dockerfile或適當建置上下文的專案。
概覽
本指南將引導您使用 Azure Pipelines 建置並推送 Docker 映像,為容器化應用程式打造流暢且安全的 CI 工作流程。您將學會如何:
- 安全地設定 Docker 身份驗證。
- 建立自動化管線以建置並推送映像。
設定 Azure DevOps 以與 Docker Hub 協作
步驟 1:設定 Docker Hub 服務連線
若要使用 Azure Pipelines 安全地進行 Docker Hub 身份驗證
- 前往 Azure DevOps 專案中的 專案設定 (Project Settings) > 服務連線 (Service Connections)。
- 選擇 新增服務連線 (New service connection) > Docker Registry。
- 選擇 Docker Hub 並提供您的 Docker Hub 憑證或存取權杖。
- 為服務連線取一個易於辨識的名稱,例如
my-docker-registry。 - 僅授予需要此連線的特定管線存取權,以提高安全性並落實最小權限原則。
重要除非絕對必要,否則請避免選擇授予所有管線存取權的選項。務必應用最小權限原則。
步驟 2:建立您的管線
將以下 azure-pipelines.yml 檔案新增至您的儲存庫根目錄
# Trigger pipeline on commits to the main branch
trigger:
- main
# Trigger pipeline on pull requests targeting the main branch
pr:
- main
# Define variables for reuse across the pipeline
variables:
imageName: 'docker.io/$(dockerUsername)/my-image'
buildTag: '$(Build.BuildId)'
latestTag: 'latest'
stages:
- stage: BuildAndPush
displayName: Build and Push Docker Image
jobs:
- job: DockerJob
displayName: Build and Push
pool:
vmImage: ubuntu-latest
demands:
- docker
steps:
- checkout: self
displayName: Checkout Code
- task: Docker@2
displayName: Docker Login
inputs:
command: login
containerRegistry: 'my-docker-registry' # Service connection name
- task: Docker@2
displayName: Build Docker Image
inputs:
command: build
repository: $(imageName)
tags: |
$(buildTag)
$(latestTag)
dockerfile: './Dockerfile'
arguments: |
--sbom=true
--attest type=provenance
--cache-from $(imageName):latest
env:
DOCKER_BUILDKIT: 1
- task: Docker@2
displayName: Push Docker Image
condition: eq(variables['Build.SourceBranch'], 'refs/heads/main')
inputs:
command: push
repository: $(imageName)
tags: |
$(buildTag)
$(latestTag)
# Optional: logout for self-hosted agents
- script: docker logout
displayName: Docker Logout (Self-hosted only)
condition: ne(variables['Agent.OS'], 'Windows_NT')此管線的功能
此管線可自動化 main 分支的 Docker 映像建置與部署流程。它透過快取、標記和條件式清理等最佳實務,確保工作流程既安全又高效。其功能如下:
- 針對目標為
main分支的提交與提取請求 (Pull Request) 進行觸發。 - 使用 Azure DevOps 服務連線安全地進行 Docker Hub 身份驗證。
- 使用 Docker BuildKit 建置並標記 Docker 映像,以進行快取。
- 將 buildId 與 latest 標籤推送至 Docker Hub。
- 若在自託管的 Linux 代理程式上執行,將會從 Docker 登出。
管線運作原理
步驟 1:定義管線觸發程序
trigger:
- main
pr:
- main此管線會在以下情況自動觸發:
- 推送到
main分支的提交 - 針對
main分支的提取請求
提示
步驟 2:定義通用變數
variables:
imageName: 'docker.io/$(dockerUsername)/my-image'
buildTag: '$(Build.BuildId)'
latestTag: 'latest'這些變數可確保在整個管線步驟中維持一致的命名、版本控制與重複使用性:
imageName:您在 Docker Hub 上的映像路徑buildTag:每次管線執行的唯一標籤latestTag:您最新映像的穩定別名
重要變數
dockerUsername不會自動設定。
請在您的 Azure DevOps 管線變數中安全地設定它:
- 前往 管線 (Pipelines) > 編輯 (Edit) > 變數 (Variables)
- 新增
dockerUsername並輸入您的 Docker Hub 使用者名稱
步驟 3:定義管線階段與作業
stages:
- stage: BuildAndPush
displayName: Build and Push Docker Image此階段僅在來源分支為 main 時執行。
提示
步驟 4:作業設定
jobs:
- job: DockerJob
displayName: Build and Push
pool:
vmImage: ubuntu-latest
demands:
- docker此作業使用由 Microsoft 託管的代理程式所提供的最新 Ubuntu VM 映像(包含 Docker 支援)。如有必要,可更換為自託管代理程式的自訂集區。
提示深入了解:在您的管線中指定集區
步驟 4.1:簽出程式碼 (Checkout code)
steps:
- checkout: self
displayName: Checkout Code此步驟將您的儲存庫程式碼拉取至建置代理程式,讓管線能夠存取 Dockerfile 與應用程式檔案。
提示深入了解:checkout 步驟說明文件
步驟 4.2:驗證 Docker Hub
- task: Docker@2
displayName: Docker Login
inputs:
command: login
containerRegistry: 'my-docker-registry' # Replace with your service connection name使用預先設定的 Azure DevOps Docker 登錄檔服務連線進行安全驗證,無需直接暴露憑證。
提示深入了解:針對 Docker Hub 使用服務連線
步驟 4.3:建置 Docker 映像
- task: Docker@2
displayName: Build Docker Image
inputs:
command: build
repository: $(imageName)
tags: |
$(buildTag)
$(latestTag)
dockerfile: './Dockerfile'
arguments: |
--sbom=true
--attest type=provenance
--cache-from $(imageName):latest
env:
DOCKER_BUILDKIT: 1此步驟以以下方式建置映像:
- 兩個標籤:一個使用唯一的建置 ID,另一個標記為 latest
- 啟用 Docker BuildKit 以加速建置並提高層級快取效率
- 從最近推送的 latest 映像中提取快取
- 軟體物料清單 (SBOM),以確保供應鏈透明度
- 來源證明 (Provenance attestation),以驗證映像的建置方式與位置
提示
步驟 4.4:推送 Docker 映像
- task: Docker@2
displayName: Push Docker Image
condition: eq(variables['Build.SourceBranch'], 'refs/heads/main')
inputs:
command: push
repository: $(imageName)
tags: |
$(buildTag)
$(latestTag)透過應用此條件,管線會在每次執行時建置 Docker 映像以確保儘早發現問題,但僅在變更合併至 main 分支時才將映像推送至登錄檔,藉此保持 Docker Hub 的整潔與專注。
這會將兩個標籤上傳至 Docker Hub:
$(buildTag)確保每次執行的可追溯性。latest用於參考最新映像。
步驟 4.5 登出 Docker(適用於自託管代理程式)
- script: docker logout
displayName: Docker Logout (Self-hosted only)
condition: ne(variables['Agent.OS'], 'Windows_NT')在管線結束時,於 Linux 的自託管代理程式上執行 docker logout,以主動清除憑證並增強安全性。
總結
透過此 Azure Pipelines CI 設定,您可以獲得:
- 使用內建服務連線進行安全的 Docker 身份驗證。
- 由程式碼變更觸發的自動化映像建置與標記。
- 利用 Docker BuildKit 快取的高效建置。
- 在持續執行的代理程式上進行安全的登出清理。
- 建置符合現代軟體供應鏈要求的映像,並附帶 SBOM 與證明。
了解更多
- Azure Pipelines 說明文件:設定與管理 Azure DevOps CI/CD 管線的綜合指南。
- Azure Pipelines 的 Docker 工作:在 Azure Pipelines 中使用 Docker 工作來建置並推送映像的詳細參考。
- Docker Buildx Bake:探索 Docker 用於複雜、多階段與多平台建置設定的高階建置工具。另請參閱 Mastering Buildx Bake 指南以獲取實用範例與最佳實務。
- Docker Build Cloud:了解 Docker 的託管建置服務,以便在雲端進行更快速、可擴充且多平台的映像建置。