Zadania kontenera w potokach YAML
Azure DevOps Services | Azure DevOps Server 2022 — Azure DevOps Server 2019
W tym artykule opisano zadania kontenera w usłudze Azure Pipelines.
Domyślnie zadania usługi Azure Pipelines są uruchamiane bezpośrednio na maszynach hosta, na których jest zainstalowany agent. Zadania hostowanego agenta są wygodne, wymagają niewielkiej początkowej konfiguracji i infrastruktury do utrzymania i są dobrze dopasowane do podstawowych projektów.
Jeśli chcesz mieć większą kontrolę nad kontekstem zadania, możesz zdefiniować i uruchomić zadania w kontenerach. Kontenery to uproszczona abstrakcja systemu operacyjnego hosta, która zapewnia izolację od hosta. Po uruchomieniu zadań w kontenerach można wybrać dokładne wersje systemów operacyjnych, narzędzi i zależności wymaganych przez kompilację.
Agenci systemów Linux i Windows mogą uruchamiać zadania potoku bezpośrednio na hoście lub w kontenerach. Zadania kontenera nie są dostępne w systemie macOS.
W przypadku zadania kontenera agent najpierw pobiera i uruchamia kontener. Następnie każdy krok zadania jest uruchamiany wewnątrz kontenera.
Jeśli potrzebujesz szczegółowej kontroli na poziomie poszczególnych kroków kompilacji, cele kroków umożliwiają wybranie kontenera lub hosta dla każdego kroku.
Wymagania wstępne
- Użyj potoku YAML. Potoki klasyczne nie obsługują zadań kontenera.
- Użyj hostowanego agenta systemu Windows lub Ubuntu. Tylko
windows-*
agenci obsługująubuntu-*
uruchamianie kontenerów. Agencimacos-*
nie obsługują uruchomionych kontenerów. - Agent jest skonfigurowany dla zadań kontenera.
- Agenci systemu Windows i Linux muszą mieć zainstalowaną platformę Docker i muszą mieć uprawnienia dostępu do demona platformy Docker.
- Kontenery nie są obsługiwane, gdy agent jest już uruchomiony w kontenerze. Nie można mieć zagnieżdżonych kontenerów.
Dodatkowe wymagania dotyczące kontenera
Kontenery oparte na systemie Linux mają następujące wymagania. Aby uzyskać obejścia, zobacz Kontenery oparte na protokole Nonglibc.
- Zainstalowano powłokę Bash
- Biblioteka GNU C (glibc) oparta na
- Nie
ENTRYPOINT
- Zapewnianie
USER
dostępu dogroupadd
i innych uprzywilejowanych poleceń bez użyciasudo
- Można uruchomić Node.js, które udostępnia agent
Uwaga
Node.js muszą być wstępnie zainstalowane dla kontenerów systemu Linux na hostach systemu Windows.
Niektóre kontenery usunięte dostępne w usłudze Docker Hub, zwłaszcza kontenery oparte na systemie Alpine Linux, nie spełniają tych wymagań. Kontenery z kontenerem ENTRYPOINT
mogą nie działać, ponieważ usługa Azure Pipelines docker create
i docker exec
oczekuje, że kontener jest zawsze uruchomiony.
Przykłady pojedynczych zadań
W poniższych przykładach zdefiniowano kontener systemu Windows lub Linux dla pojedynczego zadania.
Poniższy prosty przykład definiuje kontener systemu Linux:
pool:
vmImage: 'ubuntu-latest'
container: ubuntu:18.04
steps:
- script: printenv
Powyższy przykład informuje system o pobraniu ubuntu
obrazu oznakowanego 18.04
z usługi Docker Hub , a następnie uruchomieniu kontenera. Polecenie printenv
jest uruchamiane wewnątrz kontenera ubuntu:18.04
.
Wiele zadań
Za pomocą kontenerów można uruchomić ten sam krok w wielu zadaniach. Poniższy przykład uruchamia ten sam krok w wielu wersjach systemu Ubuntu Linux. Nie musisz wspominać o słowie jobs
kluczowym, ponieważ zdefiniowano tylko jedno zadanie.
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
Wiele zadań z pulami agentów na jednym hoście agenta
Zadanie kontenera używa pliku konfiguracji platformy Docker podstawowego agenta hosta do autoryzacji rejestru obrazów. Ten plik wy wylogował się na końcu inicjowania kontenera rejestru platformy Docker. Ściąganie obrazu rejestru dla kolejnych zadań kontenera może zostać odrzucone, unauthorized authentication
ponieważ inne zadanie uruchomione równolegle już wylogowuje plik konfiguracji platformy Docker.
Rozwiązaniem jest ustawienie zmiennej środowiskowej platformy DOCKER_CONFIG
Docker specyficznej dla każdej puli agentów uruchomionej na hostowanym agencie. Wyeksportuj DOCKER_CONFIG
skrypt runsvc.sh każdej puli agentów w następujący sposób:
export DOCKER_CONFIG=./.docker
Opcje uruchamiania
Możesz określić options
, aby kontrolować uruchamianie kontenera, jak w poniższym przykładzie:
container:
image: ubuntu:18.04
options: --hostname container-test --ip 192.168.0.1
steps:
- script: echo hello
Uruchomienie docker create --help
umożliwia wyświetlenie listy opcji, które można przekazać do wywołania platformy Docker. Nie wszystkie te opcje są gwarantowane do pracy z usługą Azure DevOps. Najpierw sprawdź, czy możesz użyć container
właściwości, aby osiągnąć ten sam cel.
Aby uzyskać więcej informacji, zobacz dokumentację polecenia docker create i definicję resources.containers.container w dokumentacji schematu YAML usługi Azure DevOps.
Definicja kontenera wielokrotnego użytku
Poniższy przykład definiuje kontenery w resources
sekcji, a następnie odwołuje się do nich za pomocą przypisanych aliasów. Słowo jobs
kluczowe jest jawnie wymienione w celu uzyskania jasności.
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
Punkty końcowe usługi
Kontenery można hostować w innych rejestrach niż w publicznej usłudze Docker Hub. Aby hostować obraz w usłudze Azure Container Registry lub innym prywatnym rejestrze kontenerów, w tym prywatnym rejestrze usługi Docker Hub, dodaj połączenie usługi w celu uzyskania dostępu do rejestru. Następnie możesz odwołać się do punktu końcowego w definicji kontenera.
Prywatne połączenie z usługą Docker Hub:
container:
image: registry:ubuntu1804
endpoint: private_dockerhub_connection
Połączenie usługi Azure Container Registry:
container:
image: myprivate.azurecr.io/windowsservercore:1803
endpoint: my_acr_connection
Uwaga
Usługa Azure Pipelines nie może skonfigurować połączenia usługi dla usługi Amazon Elastic Container Registry (ECR), ponieważ usługa Amazon ECR wymaga innych narzędzi klienckich do konwertowania poświadczeń platformy AWS na coś, czego platforma Docker może używać do uwierzytelniania.
Kontenery oparte na języku nonglibc
Agent usługi Azure Pipelines dostarcza kopię Node.js, która jest wymagana do uruchamiania zadań i skryptów. Aby dowiedzieć się, w której wersji Node.js dla hostowanego agenta, zobacz Agenci hostowani przez firmę Microsoft.
Wersja Node.js kompiluje się względem środowiska uruchomieniowego języka C używanego w chmurze hostowanej, zazwyczaj glibc. Niektóre warianty systemu Linux używają innych środowisk uruchomieniowych języka C. Na przykład alpine Linux używa musl.
Jeśli chcesz użyć kontenera opartego na formacie nonglibc, musisz:
- Podaj własną kopię Node.js.
- Dodaj etykietę do obrazu z informacją o tym, gdzie agent znajdzie Node.js binarny.
- Podaj inne zależności, od których zależy usługa Azure Pipelines:
bash
, ,sudo
which
igroupadd
.
Podaj własne Node.js
Jeśli używasz kontenera opartego na języku nonglibc, odpowiadasz za dodanie pliku binarnego Node do kontenera. Node.js 18 jest bezpiecznym wyborem. Zacznij od node:18-alpine
obrazu.
Poinformuj agenta o Node.js
Agent odczytuje etykietę "com.azure.dev.pipelines.handler.node.path"
kontenera . Jeśli ta etykieta istnieje, musi być ścieżką do pliku binarnego Node.js.
Na przykład na obrazie opartym na node:18-alpine
pliku dodaj następujący wiersz do pliku Dockerfile:
LABEL "com.azure.dev.pipelines.agent.handler.node.path"="/usr/local/bin/node"
Dodawanie wymaganych pakietów
Usługa Azure Pipelines zakłada, że system oparty na powłoce Bash z zainstalowanymi typowymi pakietami administracyjnymi. Alpine Linux w szczególności nie zawiera kilku potrzebnych pakietów. Zainstaluj program bash
, sudo
i shadow
, aby uwzględnić podstawowe potrzeby.
RUN apk add bash sudo shadow
Jeśli zależysz od dowolnych zadań wbudowanych lub w witrynie Marketplace, podaj również wymagane pliki binarne.
Pełny przykład pliku 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" ]