본문 바로가기

IT/Docker

[dockerfile] ENV와 ARG 차이

ENV vs ARG

ENV

  • 환경변수 지정
  • $변수 혹은 ${변수} 형태로 표현 가능
  • 또한, ${변수:-값}으로 값을 기본값으로 표현 가능
  • ${변수:+값}의 경우는 반대에 경우인데 사용할 일이 있을까 싶다.
  • docker run 시에 --e 옵션을 활용하여 오버라이딩 할 수 있다.

ARG

  • build 시점에만 사용되는 변수
  • ARG 변수 혹은 ARG 변수=값 형태로 표현 가능
  • ENV처럼 ${변수:+값}, ${변수:-값}으로도 표현 가능
  • docker build 시에 --build-arg 옵션을 활용하여 오버라이딩 할 수 있다.

TEST 1

Scope 확인

FROM debian:jessie-slim ENV NAME_ENV=wonchul ARG NAME_ARG=wonchul RUN echo "envirment = ${NAME_ENV:-WonChul}" \ && echo "argument = ${NAME_ARG:-WonChul}" CMD echo "envirment = ${NAME_ENV:-WonChul}" \ && echo "argument = ${NAME_ARG:-WonChul}"

  1. override 안했을 때(build, run)

$ docker build -t basic . # build # 결과 ... envirment = wonchul argument = wonchul ...

$ docker run basic # run # 결과 envirment = wonchul argument = WonChul

  1. override 했을 때(build, run)

$ docker build -t basic --build-arg NAME_ARG=WONCHUL . # build # 결과 ... envirment = wonchul argument = WONCHUL ...

$ docker run -e NAME_ENV=WONCHUL basic # run # 결과 envirment = WONCHUL argument = WonChul

TEST 2

ENV와 ARG 덮어쓰기

FROM debian:jessie-slim ARG NAME ENV NAME=${NAME:-WonChul} RUN echo "NAME = ${NAME}" CMD echo "NAME = ${NAME}"

  1. override 안했을 때(build, run)

$ docker build -t basic . # build # 결과 ... NAME = WonChul ...

$ docker run basic # run # 결과 NAME = WonChul

  1. override 했을 때(run)

$ docker run -e NAME=WONCHUL basic # run # 결과 NAME = WONCHUL

  1. override 했을 때(build, run)

$ docker build -t basic --build-arg NAME=WONCHUL . # build # 결과 ... NAME = WONCHUL ...

$ docker run basic # run # 결과 NAME = WONCHUL

$ docker run -e NAME=WONCHUL_ENV basic # run # 결과 NAME = WONCHUL_ENV