Kontejnery služby
Služby Azure DevOps
Pokud váš kanál vyžaduje podporu jedné nebo více služeb, budete možná muset vytvořit, připojit se a vyčistit služby na každou úlohu. Váš kanál může například spouštět integrační testy, které vyžadují přístup k nově vytvořené databázi a mezipaměti paměti pro každou úlohu v kanálu.
Kontejner poskytuje jednoduchý a přenosný způsob spuštění služby, na které váš kanál závisí. Kontejner služby umožňuje automaticky vytvářet, network a spravovat životní cyklus kontejnerizované služby. Každý kontejner služby je přístupný jenom pro úlohu, která ho vyžaduje. Kontejnery služeb pracují s jakýmkoli druhem úlohy, ale nejčastěji se používají s úlohami kontejneru.
Požadavky
Kontejnery služeb musí definovat nebo
CMD
ENTRYPOINT
. Kanál se spustídocker run
pro zadaný kontejner bez argumentů.Azure Pipelines může spouštět kontejnery Linuxu nebo Windows. Můžete použít buď hostovaný fond kontejnerů Ubuntu pro kontejnery Linuxu, nebo hostovaný fond Windows pro kontejnery Windows. Hostovaný fond macOS nepodporuje spouštění kontejnerů.
Poznámka:
Kontejnery služeb se v klasických kanálech nepodporují.
Jedna úloha kontejneru
Následující příklad definice kanálu YAML ukazuje jednu úlohu kontejneru.
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
Předchozí kanál načte kontejnery z buildpack-deps
Docker Hubu nginx
a pak spustí kontejnery. Kontejnery jsou vzájemně zasítěné, aby se mohly spojit podle jejich services
názvu.
V tomto kontejneru nginx
úloh se název hostitele přeloží na správné služby pomocí sítí Dockeru. Všechny kontejnery v síti automaticky zveřejňují všechny porty navzájem.
Jedna nekontejnerová úloha
Kontejnery služeb můžete použít také bez kontejneru úloh, jak je znázorněno v následujícím příkladu.
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
Předchozí kanál spustí nejnovější nginx
kontejnery. Vzhledem k tomu, že úloha není spuštěná v kontejneru, neexistuje žádný automatický překlad ip adres. Místo toho se můžete spojit se službami pomocí .localhost
Příklad explicitně poskytuje 8080:80
port.
Alternativním přístupem je umožnit dynamické přiřazení náhodného portu za běhu. K těmto dynamickým portům pak můžete přistupovat pomocí proměnných. Tyto proměnné mají tvar: agent.services.<serviceName>.ports.<port>
. Ve skriptu Bash můžete přistupovat k proměnným pomocí prostředí procesu.
V předchozím příkladu redis
je přiřazen náhodný dostupný port na hostiteli. Proměnná agent.services.redis.ports.6379
obsahuje číslo portu.
Více úloh
Kontejnery služeb jsou také užitečné pro spouštění stejných kroků pro více verzí stejné služby. V následujícím příkladu se stejný postup spustí pro více verzí 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
Porty
Když vyvoláte prostředek kontejneru nebo vložený kontejner, můžete zadat pole, které ports
se má v kontejneru zveřejnit, jako v následujícím příkladu.
resources:
containers:
- container: my_service
image: my_service:latest
ports:
- 8080:80
- 5432
services:
redis:
image: redis
ports:
- 6379/tcp
Zadání ports
se nevyžaduje, pokud je vaše úloha spuštěná v kontejneru, protože kontejnery ve stejné síti Dockeru automaticky zpřístupňují všechny porty ve výchozím nastavení.
Pokud je vaše úloha spuštěná na hostiteli, ports
potřebujete pro přístup ke službě. Port má tvar <hostPort>:<containerPort>
nebo jen <containerPort>
s volitelným /<protocol>
na konci. Například 6379/tcp
zveřejňuje tcp
přes port 6379
vázaný na náhodný port na hostitelském počítači.
Pro porty vázané na náhodný port na hostitelském počítači vytvoří kanál proměnnou formuláře agent.services.<serviceName>.ports.<port>
, aby úloha byla přístup k portu. Například agent.services.redis.ports.6379
se přeloží na náhodně přiřazený port na hostitelském počítači.
Množství
Svazky jsou užitečné ke sdílení dat mezi službami nebo k zachování dat mezi několika spuštěními úlohy. Zadáváte připojení svazků jako pole volumes
formuláře, kde <source>
může být pojmenovaný svazek nebo absolutní cesta na hostitelském počítači a <destinationPath>
je absolutní cestou <source>:<destinationPath>
v kontejneru. Svazky můžou mít název Svazky Dockeru, anonymní svazky Dockeru nebo svázání připojení k hostiteli.
services:
my_service:
image: myservice:latest
volumes:
- mydockervolume:/data/dir
- /data/dir
- /src/dir:/dst/dir
Poznámka:
Pokud používáte fondy hostované Microsoftem, vaše svazky se neuchovávají mezi úlohami, protože hostitelský počítač se po dokončení každé úlohy vyčistí.
Možnosti spuštění
Kontejnery služeb sdílejí stejné prostředky kontejneru jako úlohy kontejneru. To znamená, že můžete použít stejné možnosti spuštění.
Kontrola stavu
Pokud některý kontejner služby určuje HEALTHCHECK, může agent volitelně počkat, až bude kontejner v pořádku, než spustí úlohu.
Příklad více kontejnerů se službami
Následující příklad obsahuje webový kontejner Django Python připojený k kontejnerům databáze PostgreSQL a MySQL.
- Databáze PostgreSQL je primární databáze a její kontejner má název
db
. - Kontejner
db
používá svazek/data/db:/var/lib/postgresql/data
a do kontejneru se předávají tři databázové proměnné prostřednictvímenv
. - Kontejner
mysql
používá port3306:3306
a existují také databázové proměnné předávané prostřednictvímenv
. - Kontejner
web
je otevřený s portem8000
.
V krocích pip
nainstaluje závislosti a pak se spustí testy Django.
K nastavení funkčního příkladu potřebujete web Django nastavený se dvěma databázemi. Příklad předpokládá, že váš soubor manage.py je v kořenovém adresáři a váš projekt Django je také v tomto adresáři. Pokud ne, možná budete muset aktualizovat /__w/1/s/
cestu v /__w/1/s/manage.py test
souboru .
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