날짜: 2024-12-10
Dockerfile의 주요 명령어인 ARG
, ENV
, CMD
, RUN
의 상관관계는 Docker 이미지를 빌드하고 실행하는 단계에서 어떻게 상호작용하는지에 따라 달라집니다. 각 명령어의 역할과 상관관계를 아래에 자세히 설명합니다.
ARG
(Build-time Arguments)docker build
명령에서 --build-arg
옵션으로 값을 전달할 수 있습니다.ARG
변수는 더 이상 사용할 수 없습니다.ARG APP_ENV=production
RUN echo "App environment is $APP_ENV"
빌드 시 docker build --build-arg APP_ENV=development .
로 값을 변경할 수 있음.
ENV
(Environment Variables)ENV
로 설정된 변수는 RUN
, CMD
등 다른 명령어에서도 사용할 수 있습니다.ENV APP_ENV=production
RUN echo "App environment is $APP_ENV"
RUN
(Build-time Commands)ARG
와 ENV
에서 설정된 변수를 참조할 수 있음.ARG APP_ENV
RUN echo "App environment is $APP_ENV"
CMD
(Container Runtime Defaults)CMD
는 빌드된 이미지를 컨테이너로 실행할 때 적용됩니다.CMD
는 무시됩니다.CMD ["python", "app.py"]
ARG
와 RUN
: 이미지 빌드 과정에서만 사용됩니다.ENV
와 CMD
: 컨테이너 실행 시점에서 작동합니다.ARG
는 빌드 시점에서만 접근 가능하지만, ARG
값을 ENV
로 전달하여 런타임에서도 사용할 수 있습니다.ARG APP_ENV
ENV APP_ENV=$APP_ENV
RUN echo "App environment in build: $APP_ENV"
CMD echo "App environment in runtime: $APP_ENV"
RUN
은 레이어를 생성하고, 변경된 파일/설정을 이미지에 포함합니다.CMD
는 실행 시점의 기본 동작을 정의하므로 레이어와 무관합니다.ARG
는 빌드 시점의 동적 설정에 유용합니다.ENV
는 런타임의 동적 환경 설정에 사용됩니다.CMD
는 컨테이너 실행 시 기본 명령어를 설정합니다.# 빌드 타임 변수 정의
ARG APP_ENV=development
# 런타임 변수 설정
ENV APP_ENV=$APP_ENV
# 패키지 설치 (빌드 시점 명령어)
RUN apt-get update && apt-get install -y python3
# 실행 시 기본 명령어
CMD ["python3", "-m", "http.server"]
docker build --build-arg APP_ENV=production .
docker run -e APP_ENV=staging <image>
ARG
와 ENV
를 활용한 다중 환경별 Docker 이미지 구성목표: 빌드 시점과 실행 시점의 변수를 조합하여, 개발, 스테이징, 프로덕션 환경을 각각 구성.
Dockerfile
# 빌드 타임 변수 정의
ARG APP_ENV=development
ARG APP_PORT=5000
# 런타임 환경 변수 설정
ENV APP_ENV=$APP_ENV
ENV APP_PORT=$APP_PORT
# 빌드 작업
RUN echo "Building for $APP_ENV environment"
# 실행 시 기본 동작
CMD ["sh", "-c", "echo Running on $APP_ENV environment with port $APP_PORT"]
빌드 및 실행
docker build --build-arg APP_ENV=development --build-arg APP_PORT=5000 -t myapp:dev .
docker run myapp:dev
출력: Running on development environment with port 5000
docker build --build-arg APP_ENV=staging --build-arg APP_PORT=8000 -t myapp:staging .
docker run myapp:staging
출력: Running on staging environment with port 8000
docker build --build-arg APP_ENV=production --build-arg APP_PORT=80 -t myapp:prod .
docker run myapp:prod
출력: Running on production environment with port 80
환경별 실행 옵션 제어 컨테이너 실행 시 환경변수를 직접 오버라이드:
docker run -e APP_ENV=testing -e APP_PORT=9000 myapp:dev
# 출력: Running on testing environment with port 9000
Best Practices:
ARG
로 빌드 시점의 환경별 설정을 전달.ENV
로 컨테이너 내부에서 필요한 기본값을 설정하고, 필요 시 오버라이드 가능.