blog

Docker: ARG,ENV, RUN, CMD 를 사용한 서비스 다중환경 지원

날짜: 2024-12-10

목록으로


Dockerfile의 주요 명령어인 ARG, ENV, CMD, RUN의 상관관계는 Docker 이미지를 빌드하고 실행하는 단계에서 어떻게 상호작용하는지에 따라 달라집니다. 각 명령어의 역할과 상관관계를 아래에 자세히 설명합니다.


ARG, ENV, RUN, CMD 명령어 소개

1. ARG (Build-time Arguments)


2. ENV (Environment Variables)


3. RUN (Build-time Commands)


4. CMD (Container Runtime Defaults)


상관관계 및 주요 차이점

  1. 빌드 시점 vs 실행 시점
    • ARGRUN: 이미지 빌드 과정에서만 사용됩니다.
    • ENVCMD: 컨테이너 실행 시점에서 작동합니다.
  2. 변수 상속
    • 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"
      
  3. 이미지 레이어
    • RUN은 레이어를 생성하고, 변경된 파일/설정을 이미지에 포함합니다.
    • CMD는 실행 시점의 기본 동작을 정의하므로 레이어와 무관합니다.
  4. 유연성
    • ARG는 빌드 시점의 동적 설정에 유용합니다.
    • ENV는 런타임의 동적 환경 설정에 사용됩니다.
    • CMD는 컨테이너 실행 시 기본 명령어를 설정합니다.

TIP: 조합 활용 예시

# 빌드 타임 변수 정의
ARG APP_ENV=development

# 런타임 변수 설정
ENV APP_ENV=$APP_ENV

# 패키지 설치 (빌드 시점 명령어)
RUN apt-get update && apt-get install -y python3

# 실행 시 기본 명령어
CMD ["python3", "-m", "http.server"]

ARGENV를 활용한 다중 환경별 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"]

빌드 및 실행

  1. 개발 환경
    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

  2. 스테이징 환경
    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

  3. 프로덕션 환경
    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:

  1. 빌드 시: ARG로 빌드 시점의 환경별 설정을 전달.
  2. 런타임: ENV로 컨테이너 내부에서 필요한 기본값을 설정하고, 필요 시 오버라이드 가능.

목록으로