服務容器
Azure DevOps Services
如果您的管線需要支援一或多個服務,在許多情況下,您會想要建立、連線及清除每個服務。 例如,管線可能會執行需要存取資料庫和記憶體快取的整合測試。 您必須針對管線中的每個作業,重新建立資料庫和記憶體快取。
容器可讓您以簡單且可攜的方式執行與管線相依的服務。 服務容器可讓您自動建立容器化服務的生命週期,並為其建立網路及管理。 每個服務容器都只能由需要該服務容器的作業存取。 服務容器可與任何類型的作業搭配使用,但最常與容器作業搭配使用。
規格需求
服務容器必須定義 CMD
或 ENTRYPOINT
。
管線會針對提供的容器執行 docker run
,而不需要額外的引數。
Azure Pipelines 可以執行 Linux 或 Windows 容器。 針對 Linux 容器使用裝載的 Ubuntu,或適用于 Windows 容器的託管 Windows 容器集區。 (裝載的 macOS 集區不支援執行 containers.)
單一容器作業
使用 容器作業的簡單範例:
resources:
containers:
- container: my_container
image: buildpack-deps:focal
- container: nginx
image: nginx
pool:
vmImage: 'ubuntu-latest'
container: my_container
services:
nginx: nginx
steps:
- script: |
curl nginx
displayName: Show that nginx is running
此管線會 nginx
從Docker Hub擷取 和 buildpack-deps
容器,然後啟動容器。 容器會一起建立網路,讓他們可以依名稱 services
彼此連線。
從此作業容器內部, nginx
主機名稱會使用 Docker 網路解析為正確的服務。
網路上的所有容器都會自動公開彼此的所有埠。
單一作業
您也可以在沒有作業容器的情況下使用服務容器。 以下是簡單的範例:
resources:
containers:
- container: nginx
image: nginx
ports:
- 8080:80
env:
NGINX_PORT: 80
- container: redis
image: redis
ports:
- 6379
pool:
vmImage: 'ubuntu-latest'
services:
nginx: nginx
redis: redis
steps:
- script: |
curl localhost:8080
echo $AGENT_SERVICES_REDIS_PORTS_6379
此管線會啟動最新的 nginx
容器。 由於作業未在容器中執行,因此沒有自動名稱解析。
此範例示範如何使用 來改為觸達服務 localhost
。
在上述範例中,我們會明確提供埠 (, 8080:80
例如,) 。
替代方法是讓隨機埠在執行時間動態指派。 然後,您可以使用 變數來存取這些動態埠。
在 Bash 腳本中,您可以使用進程環境來存取變數。 這些變數的格式如下: agent.services.<serviceName>.ports.<port>
。
在上述範例中, redis
會指派主機上的隨機可用埠。
變數 agent.services.redis.ports.6379
包含埠號碼。
多個作業
服務容器也適用于針對相同服務的多個版本執行相同的步驟。 在下列範例中,相同的步驟會針對多個版本的 PostgreSQL 執行。
resources:
containers:
- container: my_container
image: ubuntu:22.04
- container: pg15
image: postgres:15
- container: pg14
image: postgres:14
pool:
vmImage: 'ubuntu-latest'
strategy:
matrix:
postgres15:
postgresService: pg15
postgres14:
postgresService: pg14
container: my_container
services:
postgres: $[ variables['postgresService'] ]
steps:
- script: printenv
連接埠
指定容器資源或內嵌容器時,您可以指定要在容器上公開的 陣列 ports
。
resources:
containers:
- container: my_service
image: my_service:latest
ports:
- 8080:80
- 5432
services:
redis:
image: redis
ports:
- 6379/tcp
ports
如果您的作業在容器中執行,則不需要指定 ,因為相同 Docker 網路上的容器預設會自動向彼此公開所有埠。
如果您的作業在主機上執行,則需要 ports
存取服務。 埠的格式 <hostPort>:<containerPort>
為 或只是 <containerPort>
,在結尾為選擇性 /<protocol>
,例如 6379/tcp
透過埠 6379
公開 tcp
,並系結至主機電腦上的隨機埠。
針對系結至主機電腦上的隨機埠的埠,管線會建立表單 agent.services.<serviceName>.ports.<port>
的變數,讓作業可以存取它。 例如, agent.services.redis.ports.6379
解析為主電腦上的隨機指派埠。
磁碟區
磁片區適用于在服務之間共用資料,或用於保存作業多個執行之間的資料。
您可以將磁片區掛接指定為 的 volumes
陣列。 磁片區可以命名為 Docker 磁片區、匿名 Docker 磁片區,或系結裝載在主機上。
services:
my_service:
image: myservice:latest
volumes:
- mydockervolume:/data/dir
- /data/dir
- /src/dir:/dst/dir
磁片區的格式 <source>:<destinationPath>
為 ,其中 <source>
可以是主機電腦上的具名磁片區或絕對路徑,而且 <destinationPath>
是容器中的絕對路徑。
注意
如果您使用我們的託管集區,則您的磁片區將不會在作業之間保存,因為主機電腦會在作業完成之後清除。
其他選項
服務容器會與容器作業共用相同的容器資源。 這表示您可以使用相同的 其他選項。
Healthcheck
或者,如果有任何服務容器指定 HEALTHCHECK,代理程式會等到容器狀況良好,再執行作業。
具有服務範例的多個容器
在此範例中,有一個 Django Python Web 容器連線到兩個資料庫容器 - PostgreSQL 和 MySQL。 PostgreSQL 資料庫是主資料庫,其容器的名稱 db
為 。 容器 db
會使用磁片區 /data/db:/var/lib/postgresql/data
,而且有三個資料庫變數會透過 env
傳遞至容器。 容器 mysql
會使用埠 3306:3306
,而且也有透過 env
傳遞的資料庫變數。 容器 web
會以埠 8000
開啟。 在步驟中, pip
安裝相依性,然後執行 Django 測試。 如果您想要設定工作範例,則需要使用 兩個資料庫來設定 Django 網站。 此範例假設您的 manage.py
檔案位於根目錄中,而 Django 專案位於該目錄中。 您可能需要更新 /__w/1/s/
中的 /__w/1/s/manage.py test
路徑。
resources:
containers:
- container: db
image: postgres
volumes:
- '/data/db:/var/lib/postgresql/data'
env:
POSTGRES_DB: postgres
POSTGRES_USER: postgres
POSTGRES_PASSWORD: postgres
- container: mysql
image: 'mysql:5.7'
ports:
- '3306:3306'
env:
MYSQL_DATABASE: users
MYSQL_USER: mysql
MYSQL_PASSWORD: mysql
MYSQL_ROOT_PASSWORD: mysql
- container: web
image: python
volumes:
- '/code'
ports:
- '8000:8000'
pool:
vmImage: 'ubuntu-latest'
container: web
services:
db: db
mysql: mysql
steps:
- script: |
pip install django
pip install psycopg2
pip install mysqlclient
displayName: set up django
- script: |
python /__w/1/s/manage.py test
意見反應
https://aka.ms/ContentUserFeedback。
即將登場:在 2024 年,我們將逐步淘汰 GitHub 問題作為內容的意見反應機制,並將它取代為新的意見反應系統。 如需詳細資訊,請參閱:提交並檢視相關的意見反應