Sdílet prostřednictvím


Úlohy kontejnerů v kanálech YAML

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 s ENTRYPOINT nemusí fungovat, protože docker exec očekává, že kontejner bude vždy spuštěný.
  • USER poskytuje přístup k groupadd a 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, whicha groupadd Azure 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" ]