Kontejnery služby
Azure DevOps Services
Pokud váš kanál vyžaduje podporu jedné nebo více služeb, v mnoha případech budete chtít vytvořit, připojit a vyčistit každou službu pro jednotlivé úlohy. Kanál může například spouštět integrační testy, které vyžadují přístup k databázi a mezipaměti paměti. Pro každou úlohu v kanálu musí být nově vytvořena mezipaměť databáze a paměti.
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, propojovat a spravovat životní cyklus kontejnerizované služby. Každý kontejner služby je přístupný pouze pro úlohu, která to vyžaduje. Kontejnery služeb fungují s libovolným typem úloh, ale nejčastěji se používají s úlohami kontejnerů.
Požadavky
Kontejnery služeb musí definovat CMD
nebo ENTRYPOINT
.
Kanál se spustí docker run
pro zadaný kontejner bez dalších argumentů.
Azure Pipelines může spouštět kontejnery Linux nebo Windows. Použijte buď hostovaný Ubuntu pro kontejnery Linuxu, nebo hostovaný fond kontejnerů Windows pro kontejnery Windows. (Hostovaný fond macOS nepodporuje spuštěné kontejnery.)
Úloha jednoho kontejneru
Jednoduchý příklad použití úloh 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
Tento kanál načte kontejnery nginx
a buildpack-deps
z Docker Hub a pak kontejnery spustí. Kontejnery jsou vzájemně propojené, aby se mohly spojit podle svého services
názvu.
Z tohoto kontejneru úloh se nginx
název hostitele přeloží na správné služby využívající sítě Dockeru.
Všechny kontejnery v síti se navzájem automaticky vystavují všechny porty.
Jedna úloha
Kontejnery služeb můžete použít také bez kontejneru úloh. Jednoduchý příklad:
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
Tento kanál spustí nejnovější nginx
kontejnery. Vzhledem k tomu, že úloha není spuštěná v kontejneru, nedochází k automatickému překladu názvů.
Tento příklad ukazuje, jak můžete místo toho přistupovat ke službám pomocí .localhost
Ve výše uvedeném příkladu poskytujeme port explicitně (například 8080:80
).
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.
Ve skriptu Bash můžete přistupovat k proměnné pomocí prostředí procesu. Tyto proměnné mají tvar: agent.services.<serviceName>.ports.<port>
.
Ve výše uvedené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
Při zadávání prostředku kontejneru nebo vloženého kontejneru můžete zadat pole ports
, které se má v kontejneru zveřejnit.
resources:
containers:
- container: my_service
image: my_service:latest
ports:
- 8080:80
- 5432
services:
redis:
image: redis
ports:
- 6379/tcp
ports
Zadání se nevyžaduje, pokud je vaše úloha spuštěná v kontejneru, protože kontejnery ve stejné síti Dockeru se ve výchozím nastavení automaticky zpřístupňují všechny porty.
Pokud je vaše úloha spuštěná na hostiteli, jsou ports
pro přístup ke službě potřeba. Port má tvar <hostPort>:<containerPort>
nebo jen <containerPort>
, s volitelným /<protocol>
na konci, například 6379/tcp
pro vystavení tcp
přes port 6379
, svázaný s náhodným portem 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 k ní úloha přistupovala. Například agent.services.redis.ports.6379
se přeloží na náhodně přiřazený port na hostitelském počítači.
Svazky
Svazky jsou užitečné pro sdílení dat mezi službami nebo pro uchovávání dat mezi několika spuštěními úlohy.
Připojení svazků můžete zadat jako pole volumes
. Svazky můžou mít buď název Svazky Dockeru, anonymní svazky Dockeru, nebo vytvořit vazbu připojení k hostiteli.
services:
my_service:
image: myservice:latest
volumes:
- mydockervolume:/data/dir
- /data/dir
- /src/dir:/dst/dir
Svazky mají tvar <source>:<destinationPath>
, kde <source>
může být pojmenovaný svazek nebo absolutní cesta na hostitelském počítači a <destinationPath>
je absolutní cesta v kontejneru.
Poznámka
Pokud použijete naše hostované fondy, nebudou se svazky mezi úlohami uchovávat, protože hostitelský počítač se po dokončení úlohy vyčistí.
Další možnosti
Kontejnery služby sdílejí stejné prostředky kontejneru jako úlohy kontejnerů. To znamená, že můžete použít stejné další možnosti.
Kontrola stavu
Volitelně platí, že pokud některý kontejner služby určuje HEALTHCHECK, agent před spuštěním úlohy počká, dokud nebude kontejner v pořádku.
Příklad více kontejnerů se službami
V tomto příkladu je webový kontejner Pythonu Django připojený ke dvěma databázovým kontejnerům – 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 jsou předány tři databázové proměnné prostřednictvím env
. Kontejner mysql
používá port 3306:3306
a existují také databázové proměnné předávané přes env
. Kontejner web
je otevřený s portem 8000
. V těchto krocích pip
nainstaluje závislosti a pak se spustí test Django. Pokud chcete nastavit funkční příklad, budete potřebovat web Django se dvěma databázemi. Tento příklad předpokládá, že se soubor manage.py
nachází v kořenovém adresáři a projekt Django je v tomto adresáři. Možná budete muset aktualizovat cestu v /__w/1/s/manage.py test
nástroji /__w/1/s/
.
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
Váš názor
https://aka.ms/ContentUserFeedback.
Připravujeme: V průběhu roku 2024 budeme postupně vyřazovat problémy z GitHub coby mechanismus zpětné vazby pro obsah a nahrazovat ho novým systémem zpětné vazby. Další informace naleznete v tématu:Odeslat a zobrazit názory pro