Poznámka
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Azure DevOps Services | Azure DevOps Server | Azure DevOps Server 2022 | Azure DevOps Server 2020
Tento článek vysvětluje úlohy kontejnerů ve službě Azure Pipelines. Kontejnery jsou odlehčené abstrakce z hostitelského operačního systému, které poskytují všechny potřebné prvky pro spuštění úlohy v konkrétním prostředí.
Ve výchozím nastavení běží úlohy Azure Pipelines přímo na agentech nainstalovaných na hostitelských počítačích. Úlohy hostovaného agenta jsou pohodlné, vyžadují minimální počáteční nastavení nebo údržbu infrastruktury a jsou vhodné pro základní projekty. Pokud chcete mít větší kontrolu nad kontextem úloh, můžete definovat a spouštět úlohy kanálu v kontejnerech, abyste získali přesné verze operačních systémů, nástrojů a závislostí, které chcete.
V případě úlohy kontejneru agent nejprve načte a spustí kontejner a potom spustí každý krok úlohy uvnitř kontejneru. Pokud potřebujete jemně odstupňovanou kontrolu jednotlivých kroků sestavení, můžete pomocí cílů kroků vybrat kontejner nebo hostitele pro každý krok.
Požadavky na úlohy kontejneru
- Kanál založený na YAML. Klasické kanály nepodporují úlohy kontejnerů.
- Agent hostovaný ve Windows nebo Ubuntu. Agenti macOS nepodporují kontejnery. Pokud chcete používat jiné agenty než Ubuntu Linux, přečtěte si téma Kontejnery založené na nonglibc.
- Docker nainstalovaný v agentu s oprávněním pro přístup k démonu Dockeru.
- Agent spuštěný přímo na hostiteli, který ještě není uvnitř kontejneru. Vnořené kontejnery se nepodporují.
Kontejnery založené na Linuxu mají také následující požadavky:
- Bash je nainstalovaný.
- Gnu C Library (
glibc)-based. Kontejnery nonglibc vyžadují přidání instalace. Další informace naleznete v tématu Kontejnery založené na nonglibc. - Ne
ENTRYPOINT. Kontejnery sENTRYPOINTnemusí fungovat, protože docker exec očekává, že kontejner bude vždy spuštěný. -
USERposkytuje přístup kgroupadda dalším privilegovaným příkazům bez použitísudo. - Schopnost spouštět Node.js, kterou agent poskytuje.
Poznámka:
Node.js musí být předinstalované pro kontejnery Linuxu na hostitelích s Windows.
Některé osekané kontejnery dostupné na Docker Hubu, zejména kontejnery založené na Alpine Linuxu, nesplňují tyto požadavky. Další informace naleznete v tématu Kontejnery založené na nonglibc.
Jedna úloha
Následující příklad definuje kontejner s jednou úlohou systému Windows nebo Linux.
Tento příklad říká systému, aby načítá ubuntu image označenou 18.04 z Docker Hubu a pak spustil kontejner. Příkaz printenv se spustí uvnitř kontejneru ubuntu:18.04 .
pool:
vmImage: 'ubuntu-latest'
container: ubuntu:18.04
steps:
- script: printenv
Více úloh
Ke spuštění stejného kroku ve více úlohách můžete použít kontejnery. Následující příklad spustí stejný krok ve více verzích Ubuntu Linuxu. Klíčové slovo nemusíte používat jobs , protože je definována pouze jedna úloha.
pool:
vmImage: 'ubuntu-latest'
strategy:
matrix:
ubuntu16:
containerImage: ubuntu:16.04
ubuntu18:
containerImage: ubuntu:18.04
ubuntu20:
containerImage: ubuntu:20.04
container: $[ variables['containerImage'] ]
steps:
- script: printenv
Více úloh na jednom hostiteli agenta
Úloha kontejneru používá ke schválení registrace obrázků konfigurační soubor Dockeru hostitelského agenta. Tento soubor se odhlásí na konci inicializace kontejneru registru Dockeru.
Vyžádání image registru pro úlohy kontejneru může být odepřeno kvůli neoprávněnému ověřování, pokud už je v agentu spuštěná jiná úloha paralelně odhlasovaná konfigurační soubor Dockeru. Řešením je nastavit proměnnou prostředí Dockeru volanou DOCKER_CONFIG pro každý fond agentů spuštěný v hostovaném agentovi.
Exportujte DOCKER_CONFIG ve skriptu runsvc.sh každého fondu agentů následujícím způsobem:
export DOCKER_CONFIG=./.docker
Možnosti spuštění
Vlastnost můžete použít options k určení možností spuštění kontejneru.
container:
image: ubuntu:18.04
options: --hostname container-test --ip 192.168.0.1
steps:
- script: echo hello
Spuštěním docker create --help získáte seznam možností, které můžete předat volání Dockeru. Ne všechny tyto možnosti jsou zaručené pro práci se službou Azure Pipelines. Nejprve zkontrolujte, jestli můžete použít container vlastnost pro stejný účel.
Další informace najdete v referenční dokumentaci ke schématu YAML pro Azure Pipelines v referenčních informacích ke kontejneru dockeru create a definici kontejneru resources.containers.container.
Opakovaně použitelná definice kontejneru
Následující příklad YAML definuje kontejnery v oddílu resources a pak je odkazuje podle jejich přiřazených aliasů. Klíčové jobs slovo se používá k přehlednosti.
resources:
containers:
- container: u16
image: ubuntu:16.04
- container: u18
image: ubuntu:18.04
- container: u20
image: ubuntu:20.04
jobs:
- job: RunInContainer
pool:
vmImage: 'ubuntu-latest'
strategy:
matrix:
ubuntu16:
containerResource: u16
ubuntu18:
containerResource: u18
ubuntu20:
containerResource: u20
container: $[ variables['containerResource'] ]
steps:
- script: printenv
Koncové body služby
Kontejnery můžete hostovat v jiných registrech, než je veřejný Docker Hub. Pokud chcete hostovat image ve službě Azure Container Registry nebo jiném privátním registru kontejneru, včetně privátního registru Docker Hubu, přidejte připojení služby pro přístup k registru. Pak můžete odkazovat na koncový bod v definici kontejneru.
Privátní připojení Docker Hubu:
container:
image: registry:ubuntu1804
endpoint: private_dockerhub_connection
Připojení ke službě Azure Container Registry:
container:
image: myprivate.azurecr.io/windowsservercore:1803
endpoint: my_acr_connection
Poznámka:
Azure Pipelines nemůže nastavit připojení služby pro Amazon Elastic Container Registry (ECR), protože Amazon ECR vyžaduje další klientské nástroje k převodu přihlašovacích údajů Amazon Web Services (AWS), aby bylo možné použít pro ověřování Dockeru.
Kontejnery bez glibc
Hostovaní agenti Azure Pipelines poskytují Node.js, což je nutné ke spouštění úloh a skriptů. Verze Node.js se zkompiluje proti modulu runtime jazyka C používanému v hostovaném cloudu, obvykle glibc. Některé varianty Linuxu používají jiné moduly runtime jazyka C. Například Alpine Linux používá musl. Další informace najdete v tématu Agenti hostovaní Microsoftem.
Pokud chcete v kanálu použít kontejner založený na neglibcu, musíte:
- Zadejte vlastní kopii Node.js.
- Přidejte k obrázku popisek odkazující na umístění Node.js binárního souboru.
-
bashZadejte závislosti ,sudo,whichagroupaddAzure Pipelines.
Zadejte vlastní Node.js
Pokud používáte kontejner založený naglibcu, musíte do kontejneru přidat binární soubor Node. Node.js 18 je bezpečná volba. Začněte z obrázku node:18-alpine .
Nasměrujte agenta na Node.js
Agent přečte štítek na kontejneru "com.azure.dev.pipelines.handler.node.path". Pokud toto označení existuje, musí se jednat o cestu k binárnímu souboru Node.js.
Například v image založené na node:18-alpine, přidejte následující řádek do souboru Dockerfile:
LABEL "com.azure.dev.pipelines.agent.handler.node.path"="/usr/local/bin/node"
Přidání požadovaných balíčků
Azure Pipelines vyžaduje, aby systém založený na Bash měl nainstalované běžné balíčky pro správu. Alpine Linux nemá několik potřebných balíčků. Nainstalujte bash, sudoa shadow pro pokrytí základních potřeb.
RUN apk add bash sudo shadow
Pokud závisíte na jakýchkoli předdefinovaných úlohách nebo úlohách Marketplace, zadejte také binární soubory, které vyžadují.
Příklad úplného souboru Dockerfile
FROM node:18-alpine
RUN apk add --no-cache --virtual .pipeline-deps readline linux-pam \
&& apk add bash sudo shadow \
&& apk del .pipeline-deps
LABEL "com.azure.dev.pipelines.agent.handler.node.path"="/usr/local/bin/node"
CMD [ "node" ]