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 testná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