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 6379vá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/dataa do kontejneru se předávají tři databázové proměnné prostřednictvím env.
  • Kontejner mysql používá port 3306:3306a existují také databázové proměnné předávané prostřednictvím env.
  • Kontejner web je otevřený s portem 8000.

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 testsouboru .

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