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 k groupadd příkazům a dalším oprávněním bez sudo

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-alpinetom 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ů. bashInstalace , sudoa 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