docker build secret 사용

개요

Docker build에서 secret 사용하기 가이드.

An overview of ARG and ENV availability.

도커파일에서 ARG는 빌드할 때만 사용되며, ENV는 컨테이너 빌드와 컨테이너 실행 모두에 사용됩니다.

docker build 할 때 --build-arg 대신 --secret 옵션을 사용할 경우, docker history에 환경변수가 노출되지 않기 때문에 더 안전한 컨테이너 이미지를 만들 수 있습니다.

docker history 확인 예시는 다음과 같습니다.

$ docker history 6591676b438c --no-trunc | grep NEXT
IMAGE                                                                     CREATED        CREATED BY
<missing>                                                                 12 hours ago   RUN |3 NEXT_PUBLIC_AWS_KMS_REGION=ap-northeast-2 NEXT_PUBLIC_AWS_KMS_DEV_KEY_ID=arn:aws:kms:ap-northeast-2:111122223333:key/059x1xx5-0x94-44x2-97x4-4x49x5xx2x23 NEXT_PUBLIC_AWS_KMS_AES_KEY_ID=arn:aws:kms:ap-northeast-2:111122223333:key/9x4943xx-9431-45b7-b415-4x175xxxxx8x /bin/sh -c secret_1="$(cat /run/secrets/NEXT_PUBLIC_AWS_KMS_ACCESS_KEY_ID)"     secret_2="$(cat /run/secrets/NEXT_PUBLIC_AWS_KMS_SECRET_ACCESS_KEY)"     NEXT_PUBLIC_AWS_KMS_ACCESS_KEY_ID=${secret_1}     NEXT_PUBLIC_AWS_KMS_SECRET_ACCESS_KEY=${secret_2}     NEXT_PUBLIC_AWS_KMS_REGION=$NEXT_PUBLIC_AWS_KMS_REGION     NEXT_PUBLIC_AWS_KMS_DEV_KEY_ID=$NEXT_PUBLIC_AWS_KMS_DEV_KEY_ID     NEXT_PUBLIC_AWS_KMS_AES_KEY_ID=$NEXT_PUBLIC_AWS_KMS_AES_KEY_ID     yarn burger-pay:build # buildkit

 

배경지식

Docker Secret 적용 사례

Docker Secret을 사용하면 아래와 같은 민감한 데이터를 안전하게 관리할 수 있습니다.

 

Docker Secret 특성

 

설정방법

dockerfile

RUN --mount=type=secret,id=NEXT_PUBLIC_AWS_KMS_ACCESS_KEY_ID \
    --mount=type=secret,id=NEXT_PUBLIC_AWS_KMS_SECRET_ACCESS_KEY \
    secret_1="$(cat /run/secrets/NEXT_PUBLIC_AWS_KMS_ACCESS_KEY_ID)" \
    secret_2="$(cat /run/secrets/NEXT_PUBLIC_AWS_KMS_SECRET_ACCESS_KEY)" \
    NEXT_PUBLIC_AWS_KMS_ACCESS_KEY_ID=${secret_1} \
    NEXT_PUBLIC_AWS_KMS_SECRET_ACCESS_KEY=${secret_2} \
    NEXT_PUBLIC_AWS_KMS_REGION=$NEXT_PUBLIC_AWS_KMS_REGION \
    NEXT_PUBLIC_AWS_KMS_DEV_KEY_ID=$NEXT_PUBLIC_AWS_KMS_DEV_KEY_ID \
    NEXT_PUBLIC_AWS_KMS_AES_KEY_ID=$NEXT_PUBLIC_AWS_KMS_AES_KEY_ID \
    yarn burger-pay:build

 

docker build

docker 명령어로 빌드 시 secret 주입하기 위해 먼저 buildkit을 활성화해야 합니다.

$ export DOCKER_BUILDKIT=1

BuildKit은 레거시 빌더를 대체하는 개선된 백엔드입니다. 빌드의 성능과 Dockerfile의 재사용성을 개선하기 위한 향상된 새 기능이 함께 제공됩니다.

 

터미널에서 환경변수를 미리 설정한 후, 아래 명령어와 같이 도커 이미지를 빌드합니다.

$ docker build \
    --secret id=NEXT_PUBLIC_AWS_KMS_ACCESS_KEY_ID,env=NEXT_PUBLIC_AWS_KMS_ACCESS_KEY_ID \
    --secret id=NEXT_PUBLIC_AWS_KMS_SECRET_ACCESS_KEY,env=NEXT_PUBLIC_AWS_KMS_SECRET_ACCESS_KEY \
    --build-arg NEXT_PUBLIC_AWS_KMS_REGION=$NEXT_PUBLIC_AWS_KMS_REGION \
    --build-arg NEXT_PUBLIC_AWS_KMS_DEV_KEY_ID=$NEXT_PUBLIC_AWS_KMS_DEV_KEY_ID \
    --build-arg NEXT_PUBLIC_AWS_KMS_AES_KEY_ID=$NEXT_PUBLIC_AWS_KMS_AES_KEY_ID .

 

참고자료

A Better Way to Handle Build-Time Secrets in Docker
Docker 빌드할 때 secret을 처리하는 더 나은 방법.
이 글이 제게 많은 도움이 되었습니다.

Understanding Docker Build Args, Environment Variables and Docker Compose Variables
ARG 와 ENV 의 차이점
Can you pass multiple Docker BuildKit secrets at once?
Don’t leak your Docker image’s build secrets
How to use Docker build secrets