Containertaken in YAML-pijplijnen
Azure DevOps Services | Azure DevOps Server 2022 - Azure DevOps Server 2019
In dit artikel worden containertaken in Azure Pipelines uitgelegd.
Standaard worden Azure Pipelines-taken rechtstreeks uitgevoerd op de hostmachines waarop de agent is geïnstalleerd. Gehoste agenttaken zijn handig, vereisen weinig initiële installatie en infrastructuur om te onderhouden en zijn geschikt voor basisprojecten.
Als u meer controle wilt over de taakcontext, kunt u taken definiëren en uitvoeren in containers. Containers zijn een lichtgewicht abstractie via het hostbesturingssysteem dat isolatie biedt van de host. Wanneer u taken uitvoert in containers, kunt u de exacte versies van besturingssystemen, hulpprogramma's en afhankelijkheden selecteren die uw build nodig heeft.
Linux- en Windows-agents kunnen pijplijntaken rechtstreeks op de host of in containers uitvoeren. Containertaken zijn niet beschikbaar in macOS.
Voor een containertaak haalt de agent eerst de container op en start deze. Vervolgens wordt elke stap van de taak uitgevoerd in de container.
Als u gedetailleerde controle nodig hebt op het niveau van de afzonderlijke buildstap, kunt u met stapdoelen een container of host voor elke stap kiezen.
Vereisten
- Gebruik een YAML-pijplijn. Klassieke pijplijnen bieden geen ondersteuning voor containertaken.
- Gebruik een gehoste Windows- of Ubuntu-agent. Alleen
windows-*
enubuntu-*
agents ondersteunen actieve containers. Demacos-*
agents bieden geen ondersteuning voor actieve containers. - Uw agent is ingesteld voor containertaken.
- Windows- en Linux-agents moeten Docker hebben geïnstalleerd en moeten zijn gemachtigd om toegang te krijgen tot de Docker-daemon.
- Containers worden niet ondersteund wanneer de agent al in een container wordt uitgevoerd. U kunt geen geneste containers hebben.
Aanvullende containervereisten
Op Linux gebaseerde containers hebben de volgende vereisten. Zie Containers op basis van Nonglibc voor tijdelijke oplossingen.
- Bash geïnstalleerd
- GNU C Library (glibc)-gebaseerd
- Nee
ENTRYPOINT
- Toegang bieden
USER
tot en andere bevoegde opdrachten zonder gebruik tegroupadd
makensudo
- Kan Node.js uitvoeren, die de agent biedt
Notitie
Node.js moet vooraf zijn geïnstalleerd voor Linux-containers op Windows-hosts.
Sommige gestripte containers die beschikbaar zijn in Docker Hub, met name containers op basis van Alpine Linux, voldoen niet aan deze vereisten. Containers met een container ENTRYPOINT
werken mogelijk niet omdat Azure Pipelines docker create
en docker exec
verwachten dat de container altijd actief is.
Voorbeelden van één taak
In de volgende voorbeelden wordt een Windows- of Linux-container voor één taak gedefinieerd.
In het volgende eenvoudige voorbeeld wordt een Linux-container gedefinieerd:
pool:
vmImage: 'ubuntu-latest'
container: ubuntu:18.04
steps:
- script: printenv
In het voorgaande voorbeeld wordt aan het systeem aangegeven dat de ubuntu
installatiekopieën moeten worden opgehaald die zijn getagd 18.04
uit Docker Hub en vervolgens de container moeten starten. De printenv
opdracht wordt uitgevoerd in de ubuntu:18.04
container.
Meerdere taken
U kunt containers gebruiken om dezelfde stap in meerdere taken uit te voeren. In het volgende voorbeeld wordt dezelfde stap uitgevoerd in meerdere versies van Ubuntu Linux. U hoeft het jobs
trefwoord niet te vermelden omdat er slechts één taak is gedefinieerd.
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
Meerdere taken met agentpools op één agenthost
Een containertaak maakt gebruik van het Docker-configuratiebestand van de onderliggende hostagent voor autorisatie van het installatiekopieregister. Dit bestand wordt afgetekend aan het einde van de initialisatie van de Docker-registercontainer. Het ophalen van registerinstallatiekopieën voor volgende containertaken kan worden geweigerd unauthorized authentication
omdat een andere taak die parallel wordt uitgevoerd, het Docker-configuratiebestand al is afgemeld.
De oplossing is het instellen van een Docker-omgevingsvariabele DOCKER_CONFIG
die specifiek is voor elke agentgroep die wordt uitgevoerd op de gehoste agent. Exporteer het DOCKER_CONFIG
runsvc.sh script van elke agentgroep als volgt:
export DOCKER_CONFIG=./.docker
Opstartopties
U kunt opgeven options
om het opstarten van containers te beheren, zoals in het volgende voorbeeld:
container:
image: ubuntu:18.04
options: --hostname container-test --ip 192.168.0.1
steps:
- script: echo hello
Als u wordt uitgevoerd docker create --help
, krijgt u de lijst met opties die u kunt doorgeven aan Docker-aanroep. Niet al deze opties werken gegarandeerd met Azure DevOps. Controleer eerst of u een container
eigenschap kunt gebruiken om hetzelfde doel te bereiken.
Zie de docker create-opdrachtreferentie en de definitie resources.containers.container in de naslaginformatie over het YAML-schema van Azure DevOps voor meer informatie.
Herbruikbare containerdefinitie
Het volgende voorbeeld definieert de containers in de resources
sectie en verwijst vervolgens naar de containers met hun toegewezen aliassen. Het jobs
trefwoord wordt expliciet vermeld voor duidelijkheid.
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
Service-eindpunten
U kunt containers in andere registers hosten dan openbare Docker Hub. Als u een installatiekopie in Azure Container Registry of een ander privécontainerregister wilt hosten, inclusief een privé Docker Hub-register, voegt u een serviceverbinding toe om toegang te krijgen tot het register. Vervolgens kunt u verwijzen naar het eindpunt in de containerdefinitie.
Privé-Docker Hub-verbinding:
container:
image: registry:ubuntu1804
endpoint: private_dockerhub_connection
Azure Container Registry-verbinding:
container:
image: myprivate.azurecr.io/windowsservercore:1803
endpoint: my_acr_connection
Notitie
Azure Pipelines kan geen serviceverbinding instellen voor Amazon Elastic Container Registry (ECR), omdat Voor Amazon ECR andere clienthulpprogramma's nodig zijn om AWS-referenties te converteren naar iets dat Docker kan gebruiken om te verifiëren.
Niet-glibc-containers
De Azure Pipelines-agent levert een kopie van Node.js, die nodig is om taken en scripts uit te voeren. Zie door Microsoft gehoste agents voor meer informatie over de versie van Node.js voor een gehoste agent.
De versie van Node.js compileert op basis van de C-runtime die wordt gebruikt in de gehoste cloud, meestal glibc. Sommige Linux-varianten gebruiken andere C-runtimes. Alpine Linux gebruikt bijvoorbeeld musl.
Als u een niet-glibc-container wilt gebruiken, moet u het volgende doen:
- Geef uw eigen exemplaar van Node.js.
- Voeg een label toe aan de afbeelding die de agent vertelt waar de Node.js binair bestand moet worden gevonden.
- Geef andere afhankelijkheden op die afhankelijk zijn van Azure Pipelines:
bash
,sudo
,which
engroupadd
.
Geef uw eigen Node.js
Als u een niet-glibc-container gebruikt, bent u verantwoordelijk voor het toevoegen van een binair knooppunt aan uw container. Node.js 18 is een veilige keuze. Begin met de node:18-alpine
afbeelding.
Vertel de agent over Node.js
De agent leest het containerlabel "com.azure.dev.pipelines.handler.node.path"
. Als dit label bestaat, moet dit het pad naar het binaire Node.js zijn.
Voeg bijvoorbeeld in een installatiekopie op node:18-alpine
basis van de volgende regel de volgende regel toe aan uw Dockerfile:
LABEL "com.azure.dev.pipelines.agent.handler.node.path"="/usr/local/bin/node"
Vereiste pakketten toevoegen
Azure Pipelines gaat ervan uit dat een op Bash gebaseerd systeem met algemene beheerpakketten is geïnstalleerd. Alpine Linux wordt met name niet geleverd met een aantal van de benodigde pakketten. Installeer bash
, sudo
en shadow
om de basisbehoeften te dekken.
RUN apk add bash sudo shadow
Als u afhankelijk bent van een in-box- of Marketplace-taken, moet u ook de binaire bestanden opgeven die ze nodig hebben.
Voorbeeld van volledig 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" ]