Docker Buildx Build –target 사용법 완벽 가이드! 특정 Build Stage 실행하기

Docker 프로젝트가 커지면 하나의 Dockerfile 안에서도 여러 환경을 관리해야 하는 경우가 많습니다.

예:

  • 개발 환경
  • 테스트 환경
  • 빌드 환경
  • 운영 환경
  • 배포 전 검증 환경

이런 상황에서는 하나의 Dockerfile 안에 여러 개의 Build Stage를 작성하는 Multi-stage Build 방식을 사용합니다.

예:

FROM node:20 AS builder

RUN npm install

RUN npm run build


FROM nginx:latest AS production

COPY --from=builder /app/dist /usr/share/nginx/html

여기에는:

builder Stage

↓

production Stage

두 개의 빌드 단계가 존재합니다.

이때 원하는 Stage까지만 실행하기 위해 사용하는 옵션이 바로 **--target**입니다.

예:

docker buildx build \
--target builder \
-t app:builder .

특정 Build Stage까지만 실행할 수 있습니다.

이번 글에서는 Docker Buildx Build –target의 개념부터 Multi-stage Build 구조, 특정 Stage 실행 방법, 개발·테스트 활용 방법까지 자세히 알아보겠습니다.

Docker Buildx Build –target이란 무엇인가?

--target은 Dockerfile 안에 정의된 특정 Build Stage를 선택하여 빌드하는 옵션입니다.

기본 형식:

docker buildx build \
--target Stage이름 .

예:

docker buildx build \
--target development \
-t app:dev .

development Stage까지만 실행합니다.

Docker Multi-stage Build란 무엇인가?

Multi-stage Build는 하나의 Dockerfile 안에서 여러 개의 빌드 단계를 나누는 방식입니다.

기본 구조:

FROM ubuntu AS build

RUN build-command


FROM ubuntu AS production

COPY --from=build /app .

구조:

Build Stage

↓

Final Stage

장점:

  • 최종 이미지 크기 감소
  • 불필요한 파일 제거
  • 개발 환경과 운영 환경 분리
  • 보안 향상

Docker Buildx Build –target이 필요한 이유

일반적인 빌드:

docker buildx build \
-t app:v1 .

기본 동작:

Dockerfile 마지막 Stage 실행

하지만 개발 과정에서는 마지막 Stage까지 필요하지 않을 수 있습니다.

예:

테스트만 필요

↓

Test Stage 실행

↓

Production Stage 생략

이럴 때:

--target test

를 사용합니다.

Docker Buildx Build –target 기본 사용법

Dockerfile:

FROM ubuntu AS base

RUN apt update


FROM base AS test

RUN echo "Testing"


FROM base AS production

RUN echo "Production"

Stage:

base

test

production

Test Stage 실행

docker buildx build \
--target test \
-t app:test .

결과:

base 실행

↓

test 실행

↓

종료

Production Stage는 실행되지 않습니다.

Docker Buildx Build –target과 일반 Build 차이

일반 Build:

docker buildx build \
-t app:v1 .

실행:

base

↓

test

↓

production

마지막 Stage까지 진행합니다.

Target 사용:

docker buildx build \
--target test \
-t app:test .

실행:

base

↓

test

종료

필요한 단계까지만 실행합니다.

Docker Buildx Build –target Stage 이름 지정 방법

Dockerfile:

FROM node AS frontend

RUN npm install


FROM nginx AS server

Stage 이름:

frontend

server

사용:

docker buildx build \
--target frontend .

AS 뒤의 이름을 사용합니다.

Docker Buildx Build –target 실무 활용 예제

개발 환경과 운영 환경 분리

Dockerfile:

FROM node:20 AS development

COPY . .

RUN npm install


FROM development AS test

RUN npm test


FROM nginx AS production

COPY --from=development /app/dist .

개발:

docker buildx build \
--target development \
-t app:dev .

테스트:

docker buildx build \
--target test \
-t app:test .

운영:

docker buildx build \
--target production \
-t app:prod .

하나의 Dockerfile로 여러 환경을 관리할 수 있습니다.

CI/CD에서 Docker Buildx Build –target 활용

CI 과정:

코드 다운로드

↓

Test Stage 실행

↓

테스트 성공

↓

Production Stage 빌드

↓

배포

예:

테스트:

docker buildx build \
--target test \
-t app:test .

배포:

docker buildx build \
--target production \
-t company/app:v1 \
--push .

효율적인 Pipeline 구성이 가능합니다.

Linux 서버 문제 해결

운영 배포 전에 테스트 단계만 확인하려고 했습니다.

기존:

docker buildx build \
-t app:test .

문제:

Production Stage까지 실행

빌드 시간 증가

Dockerfile:

FROM node AS test

FROM nginx AS production

해결:

docker buildx build \
--target test \
-t app:test .

결과:

Test Stage 완료

Production 빌드 생략

불필요한 빌드 시간을 줄일 수 있었습니다.

Docker Buildx Build –target 사용 시 주의사항

첫 번째는 지정한 Stage 이름이 정확해야 합니다.

두 번째는 Target 이후 Stage는 실행되지 않습니다.

세 번째는 테스트용 이미지와 운영 이미지를 구분해야 합니다.

네 번째는 Multi-stage 구조를 먼저 설계하는 것이 중요합니다.

Best Practice

Docker Buildx Build –target 활용 방법:

  • 개발·테스트·운영 Stage 분리
  • Stage 이름 명확하게 작성
  • CI/CD 단계별 Target 활용
  • 불필요한 빌드 제거
  • Multi-stage Build 적극 활용
  • 운영 이미지 크기 최적화

자주 묻는 질문

Docker Buildx Build –target은 무엇인가요?

Dockerfile 내부의 특정 Build Stage만 실행하는 옵션입니다.

Multi-stage Build에서만 사용할 수 있나요?

대부분 Multi-stage Build 환경에서 사용하지만 단일 Stage에서는 의미가 없습니다.

운영 이미지 생성에도 사용할 수 있나요?

가능합니다.

Production Stage를 지정하여 빌드할 수 있습니다.

Target을 사용하면 이미지 크기가 줄어드나요?

Target 자체가 줄이는 기능은 아니지만 필요한 Stage만 빌드하여 관리 효율을 높일 수 있습니다.

마무리

Docker Buildx Build –target은 복잡한 Docker 프로젝트를 효율적으로 관리하기 위한 중요한 옵션입니다.

하나의 Dockerfile 안에서 개발, 테스트, 운영 환경을 분리하고 필요한 단계만 실행할 수 있어 빌드 시간을 줄이고 관리성을 높일 수 있습니다.

특히 CI/CD 환경에서는 테스트 단계와 배포 단계를 분리하는 데 매우 유용하며, Multi-stage Build와 함께 사용하면 더욱 효율적인 Docker 운영 환경을 구축할 수 있습니다.

댓글 남기기