Docker 작업

Azure DevOps Services | Azure DevOps Server 2020 | Azure DevOps Server 2019 | TFS 2018

이 작업을 사용하여 Docker 레지스트리 서비스 연결을 사용하여 컨테이너 레지스트리에 Docker 이미지를 빌드하고 푸시합니다.

개요

다음은 스크립트에서 Docker 클라이언트 이진 파일을 직접 사용하는 것과 비교하여 Docker 작업을 사용할 때의 주요 이점입니다.

  • Docker 레지스트리 서비스 연결과 통합 - 이 작업을 통해 컨테이너 레지스트리에 연결하기 위해 Docker 레지스트리 서비스 연결을 쉽게 사용할 수 있습니다. 로그인하면 사용자는 Docker 태스크에서 이미 수행한 로그인을 활용하여 작업/스크립트를 실행하는 후속 작업을 작성할 수 있습니다. 예를 들어 Docker 작업을 사용하여 모든 Azure Container Registry 로그인한 다음 후속 작업/스크립트를 사용하여 이미지를 빌드하고 이 레지스트리에 푸시할 수 있습니다.

  • 레이블로 추가된 메타데이터 - 작업은 추적 가능성 관련 메타데이터를 다음 레이블 형식으로 이미지에 추가합니다.

    • com.azure.dev.image.build.buildnumber
    • com.azure.dev.image.build.builduri
    • com.azure.dev.image.build.definitionname
    • com.azure.dev.image.build.repository.name
    • com.azure.dev.image.build.repository.uri
    • com.azure.dev.image.build.sourcebranchname
    • com.azure.dev.image.build.sourceversion
    • com.azure.dev.image.release.definitionname
    • com.azure.dev.image.release.releaseid
    • com.azure.dev.image.release.releaseweburl
    • com.azure.dev.image.system.teamfoundationcollectionuri
    • com.azure.dev.image.system.teamproject

작업 입력

매개 변수 Description
command
명령
(필수) 가능한 값: buildAndPush, build, push, loginlogout
버전 2.173.0에 추가됨: startstop
기본값: buildAndPush
containerRegistry
컨테이너 레지스트리
(선택 사항) Docker 레지스트리 서비스 연결의 이름
repository
리포지토리
(선택 사항) 에 대한 containerRegistry입력으로 지정된 Docker 레지스트리 서비스 연결에 해당하는 컨테이너 레지스트리 내의 리포지토리 이름입니다. DockerHub에 대한 접두사 username/ 입니다.
container
컨테이너
(명령 startstop) 시작 또는 중지할 컨테이너 리소스
tags
태그
(선택 사항) 각 줄에 사용할 buildpush 태그 또는 buildAndPush 명령이 포함된 여러 줄 입력
기본값: $(Build.BuildId)
Dockerfile
Dockerfile
(선택 사항) Dockerfile의 경로입니다. 작업은 이미지를 빌드하기 위해 찾은 첫 번째 dockerfile을 사용합니다.
기본값: **/Dockerfile
buildContext
빌드 컨텍스트
(선택 사항) 빌드 컨텍스트에 대한 경로
기본값: **
arguments
인수
(선택 사항) Docker 클라이언트에 전달할 추가 인수
매개 변수에 값을 buildAndPushcommand 사용하는 경우 속성이 arguments 무시됩니다.
addPipelineData
이미지에 파이프라인 메타데이터를 추가합니다.
(선택 사항) 기본적으로 원본 분기 이름과 같은 파이프라인 데이터는 추적에 도움이 되는 빌드 ID가 추가됩니다. 예를 들어 이미지를 검사하여 이미지를 빌드한 파이프라인을 확인할 수 있습니다. 이 기본 동작을 옵트아웃할 수 있습니다.
가능한 값: true, false
기본값: true
addBaseImageData
이미지에 기본 이미지 메타데이터 추가
(선택 사항) 기본적으로 기본 이미지 이름 및 다이제스트와 같은 기본 이미지 데이터가 추가되어 추적에 도움이 됩니다. 이 기본 동작을 옵트아웃할 수 있습니다.
가능한 값: true, false
기본값: true

로그인

다음 YAML 코드 조각은 Docker 레지스트리 서비스 연결을 사용하여 컨테이너 레지스트리 로그인을 보여 줍니다.

- task: Docker@2
  displayName: Login to ACR
  inputs:
    command: login
    containerRegistry: dockerRegistryServiceConnection1

빌드 및 푸시

buildAndPush라는 편리한 명령을 사용하면 단일 명령으로 이미지를 빌드하고 컨테이너 레지스트리에 푸시할 수 있습니다. 다음 YAML 코드 조각은 이미지의 여러 태그를 빌드하고 여러 레지스트리에 푸시하는 예제입니다.

steps:
- task: Docker@2
  displayName: Login to ACR
  inputs:
    command: login
    containerRegistry: dockerRegistryServiceConnection1
- task: Docker@2
  displayName: Login to Docker Hub
  inputs:
    command: login
    containerRegistry: dockerRegistryServiceConnection2
- task: Docker@2
  displayName: Build and Push
  inputs:
    command: buildAndPush
    repository: contosoRepository # username/contosoRepository for DockerHub
    tags: |
      tag1
      tag2

위의 코드 조각에서 이미지는 contosoRepository:tag1contosoRepository:tag2 빌드되고 해당하는 dockerRegistryServiceConnection1 컨테이너 레지스트리에 푸시됩니다 dockerRegistryServiceConnection2.

인증된 모든 컨테이너 레지스트리를 한 번에 containerRegistry 빌드하고 푸시하는 대신 특정 인증된 컨테이너 레지스트리에 빌드하고 푸시하려는 경우 아래와 같이 command: buildAndPush 입력을 명시적으로 지정할 수 있습니다.

steps:
- task: Docker@2
  displayName: Build and Push
  inputs:
    command: buildAndPush
    containerRegistry: dockerRegistryServiceConnection1
    repository: contosoRepository
    tags: |
      tag1
      tag2

Logout

다음 YAML 코드 조각은 Docker 레지스트리 서비스 연결을 사용하여 컨테이너 레지스트리 로그아웃을 보여 줍니다.

- task: Docker@2
  displayName: Logout of ACR
  inputs:
    command: logout
    containerRegistry: dockerRegistryServiceConnection1

시작/중지

이 작업을 사용하여 작업 및 서비스 컨테이너를 제어할 수도 있습니다. 이 사용법은 일반적이지 않지만 고유한 상황에 사용되는 경우도 있습니다.

resources:
  containers:
  - container: builder
    image: ubuntu:18.04
steps:
- script: echo "I can run inside the container (it starts by default)"
  target:
    container: builder
- task: Docker@2
  inputs:
    command: stop
    container: builder
# any task beyond this point would not be able to target the builder container
# because it's been stopped

기타 명령 및 인수

명령 및 인수 입력을 사용하여 아래와 같이 docker 클라이언트 이진을 사용하여 빌드 또는 푸시 명령에 대한 추가 인수를 전달할 수 있습니다.

steps:
- task: Docker@2
  displayName: Login to ACR
  inputs:
    command: login
    containerRegistry: dockerRegistryServiceConnection1
- task: Docker@2
  displayName: Build
  inputs:
    command: build
    repository: contosoRepository # username/contosoRepository for DockerHub
    tags: tag1
    arguments: --secret id=mysecret,src=mysecret.txt

참고

인수 입력은 .를 제외한 buildAndPush모든 명령에 대해 평가됩니다. 편의 명령과 마찬가지로 buildAndPushbuildpusharguments 명령에 대한 입력은 무시됩니다.

문제 해결

Docker 작업이 buildAndPush 명령에 전달된 인수를 무시하는 이유는 무엇인가요?

buildAndPush 명령으로 구성된 Docker 작업은 내부적으로 실행되는 빌드 및 푸시 명령에 모호해지기 때문에 전달된 인수를 무시합니다. 명령을 별도의 빌드 및 푸시 단계로 분할하고 적절한 인수를 전달할 수 있습니다. 예를 들어 이 stackoverflow 게시물을 참조하세요.

DockerV2는 Docker 레지스트리 서비스 연결만 지원하고 ARM 서비스 연결은 지원하지 않습니다. Docker 작업에서 인증을 위해 기존 SPN(Azure 서비스 주체)을 어떻게 사용할 수 있나요?

Azure SPN 자격 증명을 사용하여 Docker 레지스트리 서비스 연결을 만들 수 있습니다. 레지스트리 유형에서 기타를 선택하고 다음과 같이 세부 정보를 제공합니다.

Docker Registry:    Your container registry URL (eg. https://myacr.azurecr.io)
Docker ID:          Service principal client ID
Password:           Service principal key

오픈 소스

이 작업은 GitHub 오픈 소스. 피드백과 기여를 환영합니다.