docker buildx bake 명령어를 사용하여 여러 타겟 빌드하는 방법

DockerBeginner
지금 연습하기

소개

이 랩에서는 docker buildx bake 명령어를 효과적으로 사용하여 단일 구성 파일에서 여러 Docker 이미지 타겟을 관리하고 빌드하는 방법을 배우게 됩니다. 먼저 다양한 구성을 가진 여러 빌드 타겟을 정의하는 docker-bake.hcl 파일을 생성하는 것으로 시작합니다.

실습 단계를 통해 bake 파일에 정의된 특정 타겟을 빌드하고, 사용 가능한 타겟을 나열하며, 명령줄 플래그를 사용하여 타겟 구성을 재정의하고, 실제로 빌드를 수행하지 않고 빌드 구성을 미리 보는 연습을 할 것입니다. 이 랩은 복잡한 프로젝트를 위한 Docker 이미지 빌드 워크플로우를 간소화하는 기술을 제공할 것입니다.

여러 타겟을 포함하는 간단한 docker-bake.hcl 파일 생성

이 단계에서는 기본적인 docker-bake.hcl 파일을 생성합니다. 이 파일은 HCL (HashiCorp Configuration Language) 형식을 사용하며, Docker 이미지에 대한 여러 빌드 타겟을 정의할 수 있습니다. 이는 서로 다른 빌드 구성이 있거나 단일 소스에서 여러 관련 이미지를 빌드하려는 경우 특히 유용합니다.

먼저, 이 랩의 작업 디렉토리인 ~/project 디렉토리로 이동합니다.

cd ~/project

이제 nano 편집기를 사용하여 docker-bake.hcl이라는 새 파일을 생성해 보겠습니다.

nano docker-bake.hcl

nano 편집기 내에서 다음 내용을 붙여넣습니다. 이 파일은 my-app-devmy-app-prod의 두 가지 빌드 타겟을 정의합니다. 각 타겟은 사용할 Dockerfile (Dockerfile), 빌드 컨텍스트 (.), 결과 이미지의 태그를 지정합니다.

target "my-app-dev" {
  dockerfile = "Dockerfile"
  context = "."
  tags = ["my-app:dev"]
}

target "my-app-prod" {
  dockerfile = "Dockerfile"
  context = "."
  tags = ["my-app:prod"]
  args = {
    BUILD_ENV = "production"
  }
}

이 파일에서:

  • target "my-app-dev"my-app-dev라는 타겟을 정의합니다.
  • dockerfile = "Dockerfile"은 빌드가 컨텍스트에서 Dockerfile이라는 파일을 사용해야 함을 지정합니다.
  • context = "."는 빌드 컨텍스트를 현재 디렉토리로 설정합니다.
  • tags = ["my-app:dev"]는 결과 이미지에 my-app:dev 태그를 할당합니다.
  • target "my-app-prod"my-app-prod라는 다른 타겟을 정의합니다.
  • 또한 Dockerfile과 현재 디렉토리를 컨텍스트로 사용합니다.
  • tags = ["my-app:prod"]는 이 이미지에 my-app:prod 태그를 할당합니다.
  • args = { BUILD_ENV = "production" }은 이 타겟의 빌드 중에 Dockerfile 에 값 production을 가진 빌드 인수 BUILD_ENV를 전달합니다.

Ctrl + S를 눌러 파일을 저장하고 Ctrl + X를 눌러 nano를 종료합니다.

다음으로, bake 파일이 참조할 간단한 Dockerfile이 필요합니다. 동일한 디렉토리에 Dockerfile이라는 파일을 생성합니다.

nano Dockerfile

다음 내용을 Dockerfile에 붙여넣습니다.

FROM alpine:latest

ARG BUILD_ENV=development

RUN echo "Building for environment: $BUILD_ENV"

CMD ["echo", "Hello from $BUILD_ENV environment!"]

Dockerfilealpine:latest 기본 이미지를 사용합니다. 기본값이 development인 빌드 인수 BUILD_ENV를 정의합니다. RUN 명령은 빌드 프로세스 중에 빌드 환경을 출력하고, CMD 명령은 이 이미지에서 컨테이너가 시작될 때 실행할 기본 명령을 설정합니다.

Dockerfile을 저장하고 nano를 종료합니다.

이제 두 개의 타겟과 함께 사용할 간단한 Dockerfile을 사용하여 docker-bake.hcl 파일을 성공적으로 생성했습니다.

docker buildx bake 를 사용하여 특정 타겟 빌드

이전 단계에서 my-app-devmy-app-prod의 두 가지 빌드 타겟을 가진 docker-bake.hcl 파일을 생성했습니다. 이제 docker buildx bake 명령어를 사용하여 이 파일에 정의된 특정 타겟을 빌드합니다.

docker buildx bake 명령어를 사용하면 bake 파일에 정의된 구성을 기반으로 이미지를 빌드할 수 있습니다. 명령 뒤에 타겟 이름을 지정하면 Buildx 가 해당 특정 타겟만 빌드하도록 지시합니다.

my-app-dev 타겟을 빌드해 보겠습니다. ~/project 디렉토리에 있는지 확인하십시오.

cd ~/project

이제 다음 명령을 실행합니다.

docker buildx bake my-app-dev

이 명령은 현재 디렉토리에서 docker-bake.hcl 파일을 읽고 my-app-dev라는 타겟을 빌드합니다. Dockerfile에 정의된 단계를 포함하여 빌드 프로세스를 나타내는 출력을 볼 수 있습니다.

[+] Building 0.0s (0/0)
... (build output) ...

빌드가 완료되면 로컬 Docker 이미지를 나열하여 my-app:dev 이미지가 생성되었는지 확인할 수 있습니다.

docker images

이미지 목록에서 dev 태그가 있는 my-app을 볼 수 있습니다.

이제 my-app-prod 타겟을 빌드해 보겠습니다. 이 타겟에는 production으로 설정된 빌드 인수 BUILD_ENV가 포함되어 있습니다.

docker buildx bake my-app-prod

출력을 관찰하십시오. 빌드 프로세스 중에 Building for environment: production 줄을 볼 수 있으며, 이는 빌드 인수가 올바르게 전달되었음을 확인합니다.

[+] Building 0.0s (0/0)
... (build output showing "Building for environment: production") ...

이 빌드가 완료된 후 이미지를 다시 나열합니다.

docker images

이제 이미지 목록에서 my-app:devmy-app:prod를 모두 볼 수 있습니다.

docker buildx bake 다음에 타겟 이름을 사용하여 bake 파일에 정의된 서로 다른 구성을 선택적으로 빌드할 수 있습니다.

bake 파일 내 사용 가능한 타겟 목록 확인

이전 단계에서 docker-bake.hcl 파일을 생성하고 특정 타겟을 빌드했습니다. 때로는 실제로 빌드하지 않고 bake 파일에 정의된 모든 사용 가능한 타겟을 확인하고 싶을 수 있습니다. docker buildx bake 명령은 이를 수행하는 방법을 제공합니다.

사용 가능한 타겟을 나열하려면 타겟 이름을 지정하지 않고 docker buildx bake 명령을 실행하면 됩니다. 기본적으로 현재 디렉토리에서 docker-bake.hcl 파일을 읽고 정의된 모든 타겟의 이름을 표시합니다.

docker-bake.hcl 파일이 있는 ~/project 디렉토리에 있는지 확인하십시오.

cd ~/project

이제 다음 명령을 실행합니다.

docker buildx bake

docker-bake.hcl 파일에 정의된 타겟을 나열하는 다음과 유사한 출력을 볼 수 있습니다.

my-app-dev
my-app-prod

이 출력은 docker-bake.hcl 파일에서 정의한 두 개의 타겟 이름인 my-app-devmy-app-prod를 보여줍니다. 이는 bake 파일에서 사용 가능한 빌드 구성을 빠르게 파악하는 방법입니다.

이 명령은 bake 파일의 구조를 이해하고 빌드할 수 있는 타겟을 식별하는 데 유용합니다.

--set 플래그를 사용하여 타겟 설정 오버라이드

이 단계에서는 docker buildx bake 명령과 함께 --set 플래그를 사용하여 docker-bake.hcl 파일에 정의된 특정 타겟의 구성을 재정의하는 방법을 배웁니다. 이는 bake 파일 자체를 수정하지 않고 타겟의 구성을 약간 조정해야 할 때 유용합니다.

--set 플래그를 사용하면 타겟의 특정 속성을 재정의할 수 있습니다. 구문은 target_name.attribute=value입니다.

예를 들어, my-app-dev 타겟을 빌드하되 다른 태그, 예를 들어 my-app:staging을 사용한다고 가정해 보겠습니다. --set 플래그를 사용하여 이를 수행할 수 있습니다.

~/project 디렉토리에 있는지 확인하십시오.

cd ~/project

이제 다음 명령을 실행합니다.

docker buildx bake my-app-dev --set my-app-dev.tags=my-app:staging

이 명령에서:

  • my-app-dev는 빌드하려는 타겟의 이름입니다.
  • --set my-app-dev.tags=my-app:stagingmy-app-dev 타겟의 tags 속성을 재정의하여 값을 my-app:staging으로 설정합니다.

빌드 프로세스 출력을 볼 수 있습니다.

[+] Building 0.0s (0/0)
... (build output) ...

빌드가 완료되면 로컬 Docker 이미지를 나열하여 새 태그가 있는 이미지가 생성되었는지 확인합니다.

docker images

이제 이전 단계에서 devprod 태그 외에도 목록에 staging 태그가 있는 my-app을 볼 수 있습니다.

빌드 인수와 같은 다른 속성도 재정의할 수 있습니다. my-app-prod 타겟을 빌드하지만 BUILD_ENV 인수를 qa로 재정의해 보겠습니다.

docker buildx bake my-app-prod --set my-app-prod.args.BUILD_ENV=qa

빌드 출력을 관찰하십시오. Building for environment: qa가 표시되어 빌드 인수가 성공적으로 재정의되었음을 나타냅니다.

[+] Building 0.0s (0/0)
... (build output showing "Building for environment: qa") ...

--set 플래그는 bake 파일을 변경하지 않고 명령줄에서 직접 빌드를 사용자 정의하는 유연한 방법을 제공합니다.

빌드 없이 결과 설정 출력

이 마지막 단계에서는 실제로 빌드를 트리거하지 않고 --set 플래그로 적용된 모든 재정의를 포함하여 docker buildx bake가 특정 타겟에 사용할 최종 구성을 확인하는 방법을 살펴봅니다. 이는 bake 파일을 디버깅하고 빌드 전에 효과적인 구성을 이해하는 데 유용합니다.

docker buildx bake와 함께 --print 플래그를 사용하면 해결된 구성을 JSON 형식으로 출력할 수 있습니다.

~/project 디렉토리에 있는지 확인하십시오.

cd ~/project

my-app-dev 타겟의 구성을 출력해 보겠습니다.

docker buildx bake my-app-dev --print

이 명령은 docker-bake.hcl 파일에서 파생된 my-app-dev 타겟의 구성을 JSON 표현으로 출력합니다.

{
  "target": {
    "my-app-dev": {
      "dockerfile": "Dockerfile",
      "context": ".",
      "tags": ["my-app:dev"]
    }
  }
}

이제 --set 플래그가 인쇄된 구성에 어떤 영향을 미치는지 살펴보겠습니다. 태그를 my-app:testing으로 재정의하면서 my-app-dev의 구성을 인쇄합니다.

docker buildx bake my-app-dev --set my-app-dev.tags=my-app:testing --print

출력을 관찰하십시오. JSON 출력의 tags 속성은 이제 재정의된 값을 반영해야 합니다.

{
  "target": {
    "my-app-dev": {
      "dockerfile": "Dockerfile",
      "context": ".",
      "tags": ["my-app:testing"]
    }
  }
}

마찬가지로 my-app-prod 타겟의 구성을 인쇄하고 빌드 인수를 재정의할 수 있습니다.

docker buildx bake my-app-prod --set my-app-prod.args.BUILD_ENV=staging --print

my-app-prod 타겟에 대한 JSON 출력은 재정의된 BUILD_ENV 값을 가진 args를 표시합니다.

{
  "target": {
    "my-app-prod": {
      "dockerfile": "Dockerfile",
      "context": ".",
      "tags": ["my-app:prod"],
      "args": {
        "BUILD_ENV": "staging"
      }
    }
  }
}

--print 플래그는 bake 파일 구성을 확인하고 잠재적으로 시간이 많이 걸리는 빌드를 시작하기 전에 재정의가 어떻게 적용되는지 이해하는 데 유용한 도구입니다.

요약

이 랩에서는 단일 docker-bake.hcl 파일에 정의된 여러 Docker 이미지 타겟을 관리하고 빌드하기 위해 docker buildx bake 명령을 활용하는 방법을 배웠습니다. 먼저, 각 타겟이 Dockerfile, 컨텍스트, 태그 및 빌드 인수를 지정하는 개별 타겟이 있는 기본 docker-bake.hcl 파일을 만들었습니다.

그런 다음 docker buildx bake <target_name>을 사용하여 bake 파일에서 특정 타겟을 빌드하는 방법, 파일 내에서 사용 가능한 모든 타겟을 나열하는 방법, --set 플래그를 사용하여 즉석에서 타겟 구성을 재정의하는 방법, 그리고 --print 플래그를 사용하여 실제로 빌드를 수행하지 않고 결과 빌드 구성을 미리 보는 방법을 살펴보았습니다. 이러한 단계는 복잡한 다중 이미지 빌드 워크플로우를 간소화하기 위한 docker buildx bake의 유연성과 강력함을 보여줍니다.