Docker 빌드 인수를 사용하여 이미지 빌드를 사용자 지정하는 방법
Dockerfile
Docker의 “빌드 인수” 메커니즘을 사용하면 이미지 빌드 프로세스 중에 참조할 수 있는 환경 변수를 정의할 수 있습니다 . 일반 명령어와 달리 ENV
어셈블리 인수는 최종 출력 이미지에 없습니다. 생성된 컨테이너 대신 빌드 프로세스를 사용자 지정하려는 경우입니다.
빌드 인수 정의
사용 지침 내에서 빌드 인수를 정의합니다 Dockerfile
.ARG
ARG EXAMPLE_VAR
ARG DEMO_VAR
RUN echo $EXAMPLE_VAR
두 인수 EXAMPLE_VAR
및 DEMO_VAR
위의 Dockerfile 빌드에 추가됩니다.
--build-arg
에 대한 플래그로 사용 가능한 인수를 설정합니다 docker build
. 에 정의된 모든 인수를 포함하도록 플래그를 여러 번 반복합니다 Dockerfile
.
docker build -t example-image:latest
–build-arg EXAMPLE_VAR=값1
–build-arg DEMO_VAR=값2
.
Dockerfile
이 명령 으로 샘플을 생성하면 value1
빌드 시 터미널에 전달됩니다. 변수 EXAMPLE_VAR
는 값이 인 빌드 환경에서 사용할 수 있게 됩니다 value1
. 플래그 값 구성 요소 --build-arg
는 선택 사항입니다. 생략하면 로컬 쉘 환경에서 변수 값이 자동으로 선택됩니다.
echo $EXAMPLE_VAR
빌드 인수는 빌드된 이미지에 저장되지 않으므로 에서 빌드 된 컨테이너 내부에서 실행할 때 빈 문자열이 표시됩니다 example-image:latest
. 실행 중인 컨테이너에서 참조해야 하는 변수는 빌드 ENV
지침 --env
또는 -e
플래그를 사용하여 추가해야 합니다.
최종 이미지에는 없지만 빌드 인수는 여전히 Docker 빌드 캐시에 영향을 줍니다. 빌드 간에 인수 값을 변경하면 첫 번째 변수 참조를 따르는 명령에 대해 캐시 누락이 발생할 수 있습니다. 정의 ARG
연산자는 캐시 무효화에 대한 책임이 없습니다.
FROM alpine:latest
ARG EXAMPLE_VAR
# 캐시가 무효화되지 않음 – arg가 사용되지 않음
RUN 예제 명령
# 빌드 캐시는 이 시점부터 사용할 수 없습니다.
RUN echo $EXAMPLE_VAR
인수 기본값 작성
해당 플래그가 지정되지 않은 경우 명령어 ARG
에 기본값을 사용할 수 있습니다 .--build-arg
ARG EXAMPLE_VAR=demo
Docker는 사용 가능한 경우 항상 --build-arg
플래그가 제공하는 값을 선호합니다. 누락된 경우 빌드 환경에 EXAMPLE_VAR
설치 됩니다. demo
이렇게 하면 거의 재정의되지 않는 인수가 있는 이미지를 만들 때 지정해야 하는 플래그 수가 줄어듭니다.
빌드 인수는 어디에서 사용할 수 있습니까?
빌드 인수는 뒤에 나오는 Dockerfile 지침에서 참조할 수 있습니다. RUN
중간 빌드 컨테이너에서 실행되는 명령 을 포함하여 대부분의 명령과 함께 작동 합니다. $EXAMPLE_VAR
인수는 구문 을 사용하여 환경 변수와 동일한 방식으로 참조됩니다 .
ARG
명령문은 어셈블리에 상당한 영향을 미친다는 점에서 고유하지만 명령문 앞에 사용할 수 있습니다 FROM
. 명령문 내에서 어셈블리 인수를 참조할 FROM
수 있으므로 사용자 구성에 따라 다른 기본 이미지를 선택할 수 있습니다.
ARG BASE_IMAGE_VERSION=alpine
FROM my-app-base:2-${BASE_IMAGE_VERSION}
docker build -t my-app:latest --build-arg BASE_IMAGE_VERSION=debian.
빌드 인수는 정의된 문자열에서 액세스할 수 있습니다. 다음 명령은 Dockerfile에서 위에 생성된 빌드 인수의 값을 참조할 수 있습니다. ARG
사용할 빌드 인수에 대한 지침을 추가해야 합니다 . 정의되기 전에 인수를 참조하거나 --build-arg
해당 인수 없이 사용 ARG
하면 빈 문자열이 생성됩니다.
빌드 인수는 다른 빌드 단계에서 작동하지 않습니다. 각 단계는 자체 빌드 인수 집합이 있는 새 빌드처럼 작동합니다. ARG
이전 단계에 포함된 지침은 각 단계에서 반복되지 않는 한 이후 단계에 영향을 주지 않습니다.
FROM php:latest
ARG 빌드_버전
FROM 작곡가:최신
ARG BUILD_VERSION
두 단계 모두 BUILD_VERSION
인수를 명시적으로 정의하므로 로 설정된 값 --build-arg
이 각각에 제공됩니다.
ARG
사전 FROM
지침 을 사용할 때도 조립 단계 고려 사항이 적용됩니다 . 이러한 인수는 빌드 단계 외부에 존재합니다. 모든 명령문에 공통적 FROM
이지만 지침에 따라 참조할 수는 없습니다. FROM
단계 내에서 -level 빌드 인수 를 재사용 하려면 ARG
명령문을 반복하여 해당 값을 가져옵니다.
# Only applies to FROM instructions
ARG BASE_IMAGE_VERSION=알파인
내 앱 기반에서:2-${BASE_IMAGE_VERSION}
# 외부 빌드 인수 참조
ARG BASE_IMAGE_VERSION
# 예상대로 작동
RUN echo $BASE_IMAGE_VERSION
이러한 특별한 문제를 제외하고 인수는 다른 모든 측면에서 환경 변수와 유사하게 동작합니다. ARG
및 명령을 사용 하여 해당 값을 재정의하고 ENV
문자열로 보간하고 형식의 확장 표현식에 사용할 수 있습니다 ${EXAMPLE_VAR:-demo}
. 변수가 설정되지 않은 demo
경우 값 으로 선택 됩니다.EXAMPLE_VAR
미리 정의된 빌드 인수
ARG
Docker는 Dockerfile에 지침을 포함하지 않더라도 기본적으로 일부 빌드 인수를 지원합니다 . 프록시 설정과 관련이 있으며 해당 --build-arg
플래그가 사용될 때마다 작동합니다. 변수는 docker history
의도한 잠재적으로 민감한 정보가 노출되는 것을 방지하기 위해 출력에서 제외됩니다. 아래에서 이 명령과 그 의미에 대해 자세히 알아보세요.
BuildKit 백엔드에서 처리하는 어셈블리는 미리 정의된 여러 다른 빌드 인수에도 액세스할 수 있습니다. 자동으로 입력된 값과 함께 제공됩니다. 목록 에는 TARGETOS
, TARGETARCH
, TARGETPLATFORM
, 및 BUILDOS
, BUILDARCH
, 및 BUILDPLATFORM
, 일부가 포함됩니다. 변수는 새 이미지가 대상으로 하는 빌드 환경 및 플랫폼의 특성을 설명합니다.
빌드 인수는 언제 사용합니까?
빌드 인수를 사용하여 Docker 이미지 빌드에 구성을 삽입할 수 있습니다. 여러 Dockerfile을 작성하지 않고 최종 이미지를 동적으로 변경하는 방법입니다.
이 메커니즘을 사용하여 어셈블리의 기본 이미지를 변경하고, 명령이 RUN
실행하는 명령을 변경하고, 이미지 사용자 지정 옵션을 제공하는 사용자 수정 옵션을 제공할 수 있습니다. 빌드 인수는 빌드 프로세스 중에만 사용되며 Dockerfile에 하드코딩하고 싶지 않은 대부분의 값에 적합합니다.
어떤 상황에서는 대체 접근 방식을 사용해야 합니다. 편리하지만 어셈블리 인수는 인증 토큰 및 키와 같은 민감한 데이터에 적합하지 않습니다. Dockerfile 명령어 이기 때문에 ARG
명령어로 이미지를 확인하면 변수와 그 값이 보입니다 docker history
. 이렇게 하면 이미지에 액세스할 수 있는 모든 사람이 빌드 중에 사용된 키를 볼 수 있습니다.
패키지 레지스트리 및 소스 제어 리포지토리에 대해 빌드 프로세스를 인증하는 데 사용되는 자격 증명은 BuildKit 빌드 비밀 형식으로 제공하는 것이 가장 좋습니다. 민감한 정보를 처리하도록 설계되었으며 이미지 지침이 아니라 빌드 환경에 파일로 탑재됩니다.
요약
빌드 인수를 사용하면 빌드 시 Dockerfile 명령과 명령줄 인수를 조합하여 Docker 이미지 빌드를 사용자 지정할 수 있습니다. 환경 변수와 달리 빌드 인수는 컨테이너를 실행하는 데 사용할 수 없지만 이미지의 레이어 기록에는 계속 표시됩니다.
빌드 인수는 빌드 프로세스에 영향을 미치는 민감하지 않은 사용자 구성 옵션에 대한 올바른 선택입니다. 대신 최종 이미지에 값을 표시하려면 환경 변수를 사용하십시오. BuildKit Secrets는 빌드에 액세스해야 하는 중요한 데이터를 위한 최고의 세 번째 옵션입니다.
답글 남기기