Szolgáltatástárolók

Azure DevOps Services

Ha a folyamathoz egy vagy több szolgáltatás támogatása szükséges, sok esetben feladatonként létre kell hoznia, csatlakoznia és törölnie kell az egyes szolgáltatásokat. Egy folyamat például olyan integrációs teszteket futtathat, amelyek hozzáférést igényelnek egy adatbázishoz és egy memória-gyorsítótárhoz. Az adatbázist és a memória-gyorsítótárat a folyamat minden egyes feladatához frissen létre kell hozni.

A tárolókkal egyszerűen és hordozható módon futtathat olyan szolgáltatásokat, amelyektől a folyamat függ. A szolgáltatástároló lehetővé teszi a tárolóalapú szolgáltatás automatikus létrehozását, hálózathoz csatlakoztatását és az életciklusának a kezelését. Az egyes szolgáltatástárolókat csak a tárolót igénylő feladat érheti el. A szolgáltatástárolók bármilyen típusú feladattal használhatók, de a leggyakrabban tárolófeladatokhoz használják őket.

Követelmények

A szolgáltatástárolóknak meg kell határozniuk egy vagy ENTRYPOINT.CMD A folyamat további argumentumok nélkül fog futni docker run a megadott tárolóhoz.

Az Azure Pipelines Linux- vagy Windows-tárolókat futtathat. Használja a linuxos tárolókhoz üzemeltetett Ubuntu-t vagy a Windows-tárolók üzemeltetett Windows-tárolókészletét. (A üzemeltetett macOS-készlet nem támogatja a tárolók futtatását.)

Egytárolós feladat

Egy egyszerű példa a tárolófeladatok használatára:

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

Ez a folyamat lekéri a és buildpack-deps a tárolókat Docker Hubnginx, majd elindítja a tárolókat. A tárolók együtt vannak hálózatban, hogy a nevük alapján services elérhessék egymást.

Ebben a feladattárolóban a gazdagép neve a nginx Docker hálózatkezelésével a megfelelő szolgáltatásokra lesz feloldva. A hálózat összes tárolója automatikusan elérhetővé teszi az összes portot egymásnak.

Egyetlen feladat

A szolgáltatástárolókat feladattároló nélkül is használhatja. Egy egyszerű példa:

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

Ez a folyamat elindítja a legújabb nginx tárolókat. Mivel a feladat nem tárolóban fut, nincs automatikus névfeloldás. Ez a példa bemutatja, hogyan érheti el a szolgáltatásokat a használatával localhost. A fenti példában explicit módon biztosítjuk a portot (például 8080:80).

Alternatív módszerként lehetővé kell tenni, hogy egy véletlenszerű port dinamikusan legyen hozzárendelve futásidőben. Ezeket a dinamikus portokat ezután változók használatával érheti el. Egy Bash-szkriptben a folyamatkörnyezet használatával érhet el egy változót. Ezek a változók a következő formában jelennek meg: agent.services.<serviceName>.ports.<port>. A fenti példában redis egy véletlenszerűen elérhető port van hozzárendelve a gazdagépen. A agent.services.redis.ports.6379 változó tartalmazza a portszámot.

Több feladat

A szolgáltatástárolók akkor is hasznosak, ha ugyanazon szolgáltatás több verzióján futtatják ugyanazokat a lépéseket. Az alábbi példában ugyanezek a lépések a PostgreSQL több verzióján futnak.

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

Portok

Tárolóerőforrás vagy beágyazott tároló megadásakor megadhatja a tárolón közzéteendő tömböt ports .

resources:
  containers:
  - container: my_service
    image: my_service:latest
    ports:
    - 8080:80
    - 5432

services:
  redis:
    image: redis
    ports:
    - 6379/tcp

A beállítás ports nem szükséges, ha a feladat tárolóban fut, mert az ugyanazon Docker-hálózaton lévő tárolók alapértelmezés szerint automatikusan elérhetővé teszik az összes portot egymásnak.

Ha a feladat a gazdagépen fut, akkor ports a szolgáltatás eléréséhez szükséges. A portok formátuma <hostPort>:<containerPort> vagy csak <containerPort>, és a végén egy nem kötelező/<protocol>, például 6379/tcp a porton 6379keresztüli elérhetővé tétel tcp szerepel, amely a gazdagép egy véletlenszerű portjához van kötve.

A gazdagép véletlenszerű portjához kötött portok esetében a folyamat létrehozza az űrlap agent.services.<serviceName>.ports.<port> változóját, hogy a feladat elérhesse. Feloldja például agent.services.redis.ports.6379 a gazdagép véletlenszerűen hozzárendelt portját.

Kötetek

A kötetek hasznosak az adatok szolgáltatások közötti megosztásához vagy a feladatok több futtatása közötti adatmegőrzéshez.

A kötetcsatlakoztatásokat a tömbjeként volumesadhatja meg. A kötetek lehetnek Docker-kötetek, névtelen Docker-kötetek vagy kötési csatlakoztatások a gazdagépen.

services:
  my_service:
    image: myservice:latest
    volumes:
    - mydockervolume:/data/dir
    - /data/dir
    - /src/dir:/dst/dir

A kötetek formátuma <source>:<destinationPath>, ahol <source> lehet egy elnevezett kötet vagy egy abszolút elérési út a gazdagépen, és <destinationPath> abszolút elérési út a tárolóban.

Megjegyzés

Ha az üzemeltetett készleteket használja, akkor a kötetek nem maradnak meg a feladatok között, mert a gazdagép a feladat befejezése után törlődik.

Egyéb lehetőségek

A szolgáltatástárolók ugyanazokon a tárolóerőforrásokon osztoznak, mint a tárolófeladatok. Ez azt jelenti, hogy ugyanazokat a további lehetőségeket használhatja.

Állapotellenőrzés

Ha bármelyik szolgáltatástároló állapotellenőrzést ad meg, az ügynök megvárja, amíg a tároló kifogástalan állapotú lesz a feladat futtatása előtt.

Több tároló például szolgáltatásokkal

Ebben a példában van egy Django Python-webtároló, amely két adatbázistárolóhoz csatlakozik: a PostgreSQL-hez és a MySQL-hez. A PostgreSQL-adatbázis az elsődleges adatbázis, és a tároló neve db. A db tároló kötetet /data/db:/var/lib/postgresql/data használ, és három adatbázisváltozó van átadva a tárolónak a segítségével env. A mysql tároló portot 3306:3306 használ, és vannak olyan adatbázisváltozók is, amelyeken keresztül továbbítva envvan. A web tároló nyitva van a porttal 8000. A lépésekben telepítse a függőségeket, pip majd futtassa a Django-tesztet. Ha be szeretne állítani egy működő példát, szüksége lesz egy Django-webhelyre, amely két adatbázissal rendelkezik. Ez a példa feltételezi, hogy a manage.py fájl a gyökérkönyvtárban van, és a Django-projekt az adott könyvtárban található. Előfordulhat, hogy frissítenie kell az elérési utat a /__w/1/s/ fájlban /__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