Azure DevOps Services | Azure DevOps Server | Azure DevOps Server 2022 | Azure DevOps Server 2020
이 문서에서는 Azure Pipelines의 컨테이너 작업을 설명합니다. 컨테이너는 특정 환경에서 작업을 실행하는 데 필요한 모든 요소를 제공하는 호스트 운영 체제의 간단한 추상화입니다.
기본적으로 Azure Pipelines 작업은 호스트 머신에 설치된 에이전트 에서 직접 실행됩니다. 호스트된 에이전트 작업은 편리하며 초기 설정 또는 인프라 유지 관리가 거의 필요하지 않으며 기본 프로젝트에 적합합니다. 작업 컨텍스트에 대한 더 많은 제어를 위해 컨테이너에서 파이프라인 작업을 정의하고 실행하여 원하는 운영 체제, 도구 및 종속성의 정확한 버전을 가져올 수 있습니다.
컨테이너 작업의 경우 에이전트는 먼저 컨테이너를 가져오고 시작한 다음 컨테이너 내에서 작업의 각 단계를 실행합니다. 개별 빌드 단계를 보다 세밀하게 제어해야 하는 경우 단계 대상을 사용하여 각 단계에 대한 컨테이너 또는 호스트를 선택할 수 있습니다.
컨테이너 작업에 대한 요구 사항
- YAML 기반 파이프라인입니다. 클래식 파이프라인은 컨테이너 작업을 지원하지 않습니다.
- Windows 또는 Ubuntu 호스트 에이전트입니다. MacOS 에이전트는 컨테이너를 지원하지 않습니다. 비 Ubuntu Linux 에이전트를 사용하려면 Nonglibc 기반 컨테이너를 참조하세요.
- Docker 디먼에 액세스할 수 있는 권한이 있는 에이전트에 설치된 Docker입니다.
- 컨테이너 내에 없는 호스트에서 직접 실행되는 에이전트입니다. 중첩된 컨테이너는 지원되지 않습니다.
Linux 기반 컨테이너에도 다음과 같은 요구 사항이 있습니다.
- Bash가 설치되었습니다.
- GNU C 라이브러리(
glibc
)를 기반으로 합니다. Nonglibc 컨테이너에는 추가 설정이 필요합니다. 자세한 내용은 Nonglibc 기반 컨테이너를 참조하세요. - 아니요
ENTRYPOINT
.ENTRYPOINT
는 컨테이너가 항상 실행될 것으로 예상하므로 컨테이너가 작동하지 않을 수 있습니다. -
USER
을 사용하지groupadd
않고 권한 있는 다른 명령에 대한 액세스sudo
권한과 함께 제공됩니다. - 에이전트가 제공하는 Node.js실행할 수 있습니다.
참고
Node.js Windows 호스트의 Linux 컨테이너에 대해 미리 설치해야 합니다.
Docker 허브에서 사용할 수 있는 일부 제거된 컨테이너, 특히 Alpine Linux 기반 컨테이너는 이러한 요구 사항을 충족하지 않습니다. 자세한 내용은 Nonglibc 기반 컨테이너를 참조하세요.
단일 작업
다음 예제에서는 Windows 또는 Linux 단일 작업 컨테이너를 정의합니다.
이 예제에서는 ubuntu
에서 태그가 지정된 18.04
이미지를 가져온 다음 컨테이너를 시작하도록 시스템에 지시합니다.
printenv
명령은 ubuntu:18.04
컨테이너 안에서 실행됩니다.
pool:
vmImage: 'ubuntu-latest'
container: ubuntu:18.04
steps:
- script: printenv
여러 작업
컨테이너를 사용하여 여러 작업에서 동일한 단계를 실행할 수 있습니다. 다음 예제에서는 여러 버전의 Ubuntu Linux에서 동일한 단계를 실행합니다. 단일 작업만 정의되므로 키워드를 사용할 jobs
필요가 없습니다.
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
단일 에이전트 호스트에서 여러 작업
컨테이너 작업은 이미지 레지스트리 권한 부여를 위해 기본 호스트 에이전트의 Docker 구성 파일을 사용합니다. 이 파일은 Docker 레지스트리 컨테이너 초기화가 끝날 때 로그아웃합니다.
에이전트에서 병렬로 실행되는 다른 작업이 Docker 구성 파일을 이미 로그아웃한 경우 컨테이너 작업에 대한 레지스트리 이미지 끌어오기는 권한 없는 인증에 대해 거부될 수 있습니다. 솔루션은 호스트된 에이전트에서 실행되는 각 에이전트 풀에 대해 호출 DOCKER_CONFIG
되는 Docker 환경 변수를 설정하는 것입니다.
DOCKER_CONFIG
다음과 같이 각 에이전트 풀의 runsvc.sh 스크립트에서 내보냅니다.
export DOCKER_CONFIG=./.docker
시작 옵션
이 속성을 사용하여 options
컨테이너 시작 옵션을 지정할 수 있습니다.
container:
image: ubuntu:18.04
options: --hostname container-test --ip 192.168.0.1
steps:
- script: echo hello
실행 docker create --help
하여 Docker 호출에 전달할 수 있는 옵션 목록을 가져옵니다. 이러한 모든 옵션이 Azure Pipelines에서 작동하도록 보장되는 것은 아닙니다. 먼저 동일한 용도로 container
속성을 사용할 수 있는지 확인합니다.
자세한 내용은 Azure Pipelines에 대한 YAML 스키마 참조에서 docker container create 명령 참조 및 resources.containers.container 정의를 참조하세요.
재사용 가능한 컨테이너 정의
다음 YAML 예제에서는 섹션의 컨테이너를 resources
정의한 다음 할당된 별칭으로 참조합니다. 이 jobs
키워드는 명확성을 위해 사용됩니다.
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
서비스 엔드포인트
공용 Docker Hub 이외의 레지스트리에서 컨테이너를 호스트할 수 있습니다. Azure Container Registry 또는 프라이빗 Docker Hub 레지스트리를 포함한 다른 프라이빗 컨테이너 레지스트리에서 이미지를 호스트하려면 레지스트리에 액세스하기 위한 서비스 연결을 추가합니다. 그런 다음 컨테이너 정의에서 엔드포인트를 참조할 수 있습니다.
프라이빗 Docker 허브 연결:
container:
image: registry:ubuntu1804
endpoint: private_dockerhub_connection
Azure Container Registry 연결:
container:
image: myprivate.azurecr.io/windowsservercore:1803
endpoint: my_acr_connection
참고
Amazon ECR은 Aws(Amazon Web Services) 자격 증명을 Docker 인증에 사용할 수 있도록 변환하는 다른 클라이언트 도구가 필요하기 때문에 Azure Pipelines는 ECR(Amazon Elastic Container Registry)에 대한 서비스 연결을 설정할 수 없습니다.
Nonglibc 기반 컨테이너
호스트된 Azure Pipelines 에이전트는 태스크 및 스크립트를 실행하는 데 필요한 Node.js제공합니다. Node.js 버전은 일반적으로 호스트된 클라우드에서 사용되는 C 런타임에 대해 컴파일됩니다 glibc
. 일부 Linux 변형은 다른 C 런타임을 사용합니다. 예를 들어 Alpine Linux는 .를 사용합니다 musl
. 자세한 내용은 Microsoft 호스팅 에이전트를 참조하세요.
파이프라인에서 nonglibc 기반 컨테이너를 사용하려면 다음을 수행해야 합니다.
- 고유한 Node.js 복사본을 제공합니다.
- Node.js 이진 파일의 위치를 가리키는 레이블을 이미지에 추가합니다.
-
bash
,sudo
및which
groupadd
Azure Pipelines 종속성을 제공합니다.
고유한 Node.js 제공
nonglibc 기반 컨테이너를 사용하는 경우 컨테이너에 노드 이진 파일을 추가해야 합니다. Node.js 18은 안전한 선택입니다.
node:18-alpine
이미지에서 시작합니다.
에이전트를 Node.js 지시
에이전트가 컨테이너 레이블 "com.azure.dev.pipelines.handler.node.path"
을 읽습니다. 이 레이블이 있는 경우 Node.js 이진 파일의 경로여야 합니다.
예를 들어 node:18-alpine
을(를) 기반으로 한 이미지에서 Dockerfile에 다음 줄을 추가합니다.
LABEL "com.azure.dev.pipelines.agent.handler.node.path"="/usr/local/bin/node"
필수 패키지 추가
Azure Pipelines를 사용하려면 Bash 기반 시스템에 일반적인 관리 패키지가 설치되어 있어야 합니다. Alpine Linux에는 필요한 패키지가 몇 가지 없습니다.
bash
를 설치sudo
하고 shadow
기본 요구 사항을 충족합니다.
RUN apk add bash sudo shadow
기본 제공 또는 Marketplace 작업에 의존하는 경우 필요한 이진 파일도 제공합니다.
전체 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" ]