Definování úloh kontejneru (YAML)
Azure DevOps Services | Azure DevOps Server 2022 – Azure DevOps Server 2019
Ve výchozím nastavení se úlohy spouštějí na hostitelském počítači, na kterém je nainstalovaný agent. To je pohodlné a obvykle dobře vhodné pro projekty, které teprve začínají využívat Azure Pipelines. V průběhu času můžete zjistit, že chcete mít větší kontrolu nad kontextem, ve kterém se vaše úlohy spouštějí. Kanály YAML nabízejí úlohy kontejnerů pro tuto úroveň řízení.
V linuxových a windows agentech můžou být úlohy spuštěné na hostiteli nebo v kontejneru. (V systémech macOS a Red Hat Enterprise Linux 6 nejsou úlohy kontejnerů k dispozici.) Kontejnery poskytují izolaci od hostitele a umožňují připnout konkrétní verze nástrojů a závislostí. Úlohy hostitele vyžadují k údržbě méně počátečního nastavení a infrastruktury.
Kontejnery nabízejí jednoduchou abstrakci hostitelského operačního systému. Můžete vybrat přesné verze operačních systémů, nástrojů a závislostí, které sestavení vyžaduje. Když v kanálu zadáte kontejner, agent nejprve načte a spustí kontejner. Pak se každý krok úlohy spustí uvnitř kontejneru. Nemůžete mít vnořené kontejnery. Kontejnery se nepodporují, pokud už agent běží uvnitř kontejneru.
Pokud potřebujete jemně odstupňovaný ovládací prvek na úrovni jednotlivých kroků, cíle kroků umožňují zvolit kontejner nebo hostitele pro každý krok.
Požadavky
Kontejnery založené na Linuxu
Systém Azure Pipelines vyžaduje v linuxových kontejnerech několik věcí:
- Bash
- glibc-based
- Může spustit Node.js (který agent poskytuje)
- Nedefinuje
ENTRYPOINT
USER
má přístup kgroupadd
příkazům a dalším oprávněním bezsudo
A na hostiteli agenta:
- Ujistěte se, že je Docker nainstalovaný.
- Agent musí mít oprávnění pro přístup k procesu démona Dockeru.
Ujistěte se, že váš kontejner má k dispozici všechny tyto nástroje. Některé kontejnery, které jsou v Docker Hubu dostupné, zejména ty, které jsou založené na Alpine Linuxu, nesplňují tyto minimální požadavky. Kontejnery s ENTRYPOINT
určitou možností nemusí fungovat, protože Azure Pipelines čeká docker create
na kontejner a docker exec
řadu příkazů, které očekávají, že kontejner je vždy spuštěný a spuštěný.
Poznámka:
Pro linuxové kontejnery založené na Windows musí být Node.js předinstalovaný.
Kontejnery Windows
Azure Pipelines může také spouštět kontejnery Windows. Vyžaduje se Windows Server verze 1803 nebo vyšší. Musí být nainstalovaný Docker. Ujistěte se, že váš agent kanálů má oprávnění pro přístup k procesu démona Dockeru.
Kontejner Windows musí podporovat spuštění Node.js. Základní kontejner Windows Nano Serveru chybí závislosti potřebné ke spuštění uzlu.
Hostovaní agenti
Pouze windows-2019
image podporují ubuntu-*
spouštění kontejnerů.
Image macOS nepodporuje spouštění kontejnerů.
Jedna úloha
Jednoduchý příklad:
pool:
vmImage: 'ubuntu-latest'
container: ubuntu:18.04
steps:
- script: printenv
Tím systému řeknete, aby načítá ubuntu
image označenou 18.04
z Docker Hubu a pak spustil kontejner. Když se printenv
příkaz spustí, stane se to uvnitř kontejneru ubuntu:18.04
.
Příklad Windows:
pool:
vmImage: 'windows-2019'
container: mcr.microsoft.com/windows/servercore:ltsc2019
steps:
- script: set
Poznámka:
Systém Windows vyžaduje, aby se verze jádra hostitele a kontejneru shodovaly.
Vzhledem k tomu, že tento příklad používá image Windows 2019, použijeme 2019
značku kontejneru.
Více úloh
Kontejnery jsou také užitečné pro spouštění stejných kroků ve více úlohách.
V následujícím příkladu se stejný postup spustí ve více verzích Ubuntu Linuxu.
(A nemusíme zmínit jobs
klíčové slovo, 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
Koncové body
Kontejnery je možné hostovat v jiných registrech než veřejné registry Docker Hubu. 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 k privátnímu registru. Pak na ni můžete odkazovat ve specifikaci kontejneru:
container:
image: registry:ubuntu1804
endpoint: private_dockerhub_connection
steps:
- script: echo hello
nebo
container:
image: myprivate.azurecr.io/windowsservercore:1803
endpoint: my_acr_connection
steps:
- script: echo hello
Můžou fungovat i jiné registry kontejnerů. Amazon ECR v současné době nefunguje, protože existují další klientské nástroje potřebné k převodu přihlašovacích údajů AWS na něco, co Docker může použít k ověření.
Poznámka:
Sestavení Red Hat Enterprise Linux 6 agenta nespustí úlohu kontejneru. Zvolte jinou variantu Linuxu, například Red Hat Enterprise Linux 7 nebo vyšší.
Možnosti
Pokud potřebujete řídit spuštění kontejneru, můžete zadat options
.
container:
image: ubuntu:18.04
options: --hostname container-test --ip 192.168.0.1
steps:
- script: echo hello
Spuštění docker create --help
vám poskytne seznam možností, které se dají předat volání Dockeru. Ne všechny tyto možnosti jsou zaručené pro práci s Azure DevOps. Nejprve zkontrolujte, jestli můžete použít vlastnost kontejneru k dosažení stejného cíle. Další informace najdete resources.containers.container
ve schématuYAML a v referenčních informacích k příkazůmdocker create
.
Opakovaně použitelná definice kontejneru
V následujícím příkladu jsou kontejnery definovány v oddílu prostředků.
Na každý kontejner se pak později odkazuje odkazem na jeho přiřazený alias.
(Tady explicitně vypíšeme jobs
klíčové slovo pro přehlednost.)
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
Kontejnery, které nejsou založené na glibc
Agent Azure Pipelines poskytuje kopii Node.js, která se vyžaduje ke spouštění úloh a skriptů. Pokud chcete zjistit verzi Node.js pro hostovaného agenta, podívejte se na agenty hostované Microsoftem. Verze Node.js se kompiluje proti modulu runtime jazyka C, který používáme v hostovaném cloudu, obvykle glibc. Některé varianty Linuxu používají jiné moduly runtime jazyka C. Například Alpine Linux používá musl.
Pokud chcete jako kontejner úloh použít kontejner, který není založený na glibc, budete si muset sami uspořádat několik věcí. Nejprve musíte zadat vlastní kopii Node.js. Za druhé, musíte do obrázku přidat popisek, který agentovi říká, kde najít binární soubor Node.js. Nakonec stock Alpine nepřichází s dalšími závislostmi, na kterých azure Pipelines závisí: bash, sudo, který a groupadd.
Používání vlastního Node.js
Zodpovídáte za přidání binárního souboru Node do kontejneru.
Node 14 je bezpečná volba.
Můžete začít z obrázku node:14-alpine
.
Informujte agenta o Node.js.
Agent přečte popisek kontejneru com.azure.dev.pipelines.handler.node.path.
Pokud tento popisek existuje, musí to být cesta k binárnímu souboru Node.js.
Například v imagi založené na node:10-alpine
tom přidejte tento řádek do souboru Dockerfile:
LABEL "com.azure.dev.pipelines.agent.handler.node.path"="/usr/local/bin/node"
Přidání požadavků
Azure Pipelines předpokládá systém založený na Bashu s nainstalovanými běžnými balíčky pro správu.
Alpine Linux zejména neobsahuje několik potřebných balíčků.
bash
Instalace , sudo
a shadow
bude zahrnovat základní potřeby.
RUN apk add bash sudo shadow
Pokud závisíte na jakýchkoli úlohách v balení nebo Marketplace, budete také muset zadat binární soubory, které vyžadují.
Úplný příklad souboru Dockerfile
FROM node:10-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" ]
Více úloh s fondy agentů v jednom hostovaném agentu
Úloha kontejneru používá základního agenta hostitele Docker config.json pro autorizaci registru imagí, která se odhlásí na konci inicializace kontejneru registru Dockeru. Následná autorizace vyžádání image registru může být odepřena kvůli neoprávněnému ověřování, protože soubor Docker config.json zaregistrovaný v systému pro ověřování už byl odhlášený jednou z dalších úloh kontejneru, které běží paralelně.
Řešením je nastavit proměnnou DOCKER_CONFIG
prostředí Dockeru specifickou pro každou službu fondu agentů spuštěnou v hostovaném agentovi. Exportujte skript DOCKER_CONFIG
runsvc.sh každého fondu agentů:
#insert anything to set up env when running as a service
export DOCKER_CONFIG=./.docker
Váš názor
https://aka.ms/ContentUserFeedback.
Připravujeme: V průběhu roku 2024 budeme postupně vyřazovat problémy z GitHub coby mechanismus zpětné vazby pro obsah a nahrazovat ho novým systémem zpětné vazby. Další informace naleznete v tématu:Odeslat a zobrazit názory pro