Szolgáltatástárolók
Azure DevOps Services
Ha a folyamat egy vagy több szolgáltatás támogatását igényli, előfordulhat, hogy feladatonként létre kell hoznia, csatlakoznia kell és törölnie kell a szolgáltatásokat. Előfordulhat például, hogy a folyamat olyan integrációs teszteket futtat, amelyek hozzáférést igényelnek egy újonnan létrehozott adatbázishoz és memória-gyorsítótárhoz a folyamat minden egyes feladatához.
A tárolók egyszerű és hordozható módot biztosítanak egy olyan szolgáltatás futtatására, amelytől a folyamat függ. A szolgáltatástárolók lehetővé teszi a tárolóalapú szolgáltatások életciklusának automatikus létrehozását, hálózatba helyezését és kezelését. Minden szolgáltatástároló csak az azt igénylő feladat számára érhető el. A szolgáltatástárolók bármilyen feladattal működnek, de leggyakrabban tárolófeladatokkal használják.
Követelmények
A szolgáltatástárolóknak meg kell határozniuk egy
CMD
vagyENTRYPOINT
. A folyamat argumentumok nélkül futdocker run
a megadott tárolóhoz.Az Azure Pipelines Linux- vagy Windows-tárolókat futtathat. Használhatja a linuxos tárolók üzemeltetett Ubuntu tárolókészletét, vagy a Windows-tárolók üzemeltetett Windows-készletét. A üzemeltetett macOS-készlet nem támogatja a tárolók futtatását.
Feljegyzés
A szolgáltatástárolók nem támogatottak a klasszikus folyamatokban.
Egytárolós feladat
Az alábbi példa YAML-folyamatdefiníció egyetlen tárolófeladatot mutat be.
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
Az előző folyamat lekéri az és buildpack-deps
a tárolókat a nginx
Docker Hubról, majd elindítja a tárolókat. A tárolók hálózatba vannak állítva, hogy a nevük alapján services
elérhessék egymást.
Ebben a feladattárolóban a gazdagép neve docker-hálózatkezeléssel nginx
oldja fel a megfelelő szolgáltatásokat. A hálózaton lévő összes tároló automatikusan elérhetővé teszi az összes portot egymásnak.
Egyetlen nem kontainer feladat
A szolgáltatástárolókat feladattároló nélkül is használhatja, ahogyan az alábbi példában is látható.
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
Az előző folyamat elindítja a legújabb nginx
tárolókat. Mivel a feladat nem tárolóban fut, nincs automatikus névfeloldás. Ehelyett a szolgáltatásokat a következővel localhost
érheti el: . A példa explicit módon biztosítja a portot 8080:80
.
Egy másik módszer, ha lehetővé teszi egy véletlenszerű port dinamikus hozzárendelését futásidőben. Ezeket a dinamikus portokat ezután változókkal érheti el. Ezek a változók a következő formában lesznek: agent.services.<serviceName>.ports.<port>
. Egy Bash-szkriptben a folyamatkörnyezet használatával érheti el a változókat.
Az előző 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 ugyanazt a lépést ugyanazon szolgáltatás több verzióján futtatják. 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ó meghívásakor megadhatja a tárolón közzéteendő tömböt ports
, ahogyan az alábbi példában is látható.
resources:
containers:
- container: my_service
image: my_service:latest
ports:
- 8080:80
- 5432
services:
redis:
image: redis
ports:
- 6379/tcp
ports
Nem szükséges megadni, ha a feladat tárolóban fut, mert az ugyanazon a 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, ports
a szolgáltatás eléréséhez szükséges. A portok formátuma <hostPort>:<containerPort>
vagy csak <containerPort>
a végén választható /<protocol>
. Például 6379/tcp
a gazdagép egy véletlenszerű portjához kötött porton 6379
keresztül teszi elérhetővétcp
.
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 hozzáférhessen a porthoz. Feloldja például agent.services.redis.ports.6379
a gazdagép véletlenszerűen hozzárendelt portját.
Mennyiségek
A kötetek hasznosak az adatok szolgáltatások közötti megosztásához vagy egy feladat több futtatása közötti adatmegőrzéshez. A kötetcsatlakozásokat az űrlap tömbjeként volumes
adhatja meg, ahol <source>
egy elnevezett kötet vagy egy abszolút elérési út lehet a gazdagépen, és <destinationPath>
abszolút elérési út a tárolóban.<source>:<destinationPath>
A kötetek nevezhetők Docker-köteteknek, névtelen Docker-köteteknek vagy kötéscsatlakozásoknak a gazdagépen.
services:
my_service:
image: myservice:latest
volumes:
- mydockervolume:/data/dir
- /data/dir
- /src/dir:/dst/dir
Feljegyzés
Ha Microsoft által üzemeltetett készleteket használ, a kötetek nem maradnak meg a feladatok között, mert a gazdagép az egyes feladatok befejezése után törlődik.
Indítási beállítások
A szolgáltatástárolók ugyanazokkal a tárolóerőforrásokkal osztoznak, mint a tárolófeladatok. Ez azt jelenti, hogy ugyanazokat az indítási beállításokat használhatja.
Állapot-ellenőrzés
Ha bármelyik szolgáltatástároló a HEALTHCHECK értéket adja meg, az ügynök opcionálisan megvárhatja, amíg a tároló kifogástalan állapotban van a feladat futtatása előtt.
Több tároló például szolgáltatásokkal
Az alábbi példában egy Django Python-webtároló van csatlakoztatva a PostgreSQL- és MySQL-adatbázistárolókhoz.
- A PostgreSQL-adatbázis az elsődleges adatbázis, a tároló neve pedig .
db
- A
db
tároló kötetet/data/db:/var/lib/postgresql/data
használ, és három adatbázisváltozót ad át a tárolónakenv
. - A
mysql
tároló portot3306:3306
használ, és vannak adatbázisváltozók is.env
- A
web
tároló nyitva van a porttal8000
.
A lépések során telepíti a függőségeket, pip
majd django-teszteket futtat.
Egy működő példa beállításához be kell állítania egy Django-webhelyet, amely két adatbázissal rendelkezik. A példa feltételezi, hogy a manage.py fájl a gyökérkönyvtárban található, és a Django-projekt is ezen a könyvtáron belül található. Ha nem, előfordulhat, hogy frissítenie kell az elérési utat a /__w/1/s/
következőben /__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