Docker

[Docker] Dockerfile reference - Environment Replacement

patrick-star 2023. 8. 23. 12:52
728x90

Dockerfile에서 Enviornment 변수(ENV 명령어로 선언됨)를 사용하여 특정 명령에서 변수를 사용할 수 있다.

Environment 변수는 Dockerfile에서 $변수이름 또는 ${변수이름}으로 표현할 수 있다.
둘 다 같은 의미를 표현하고 괄호를 사용한 경우 일반적으로 공백이 없는 변수 이름과 관련된 문제를 해결하는 데 사용된다.
(ex. ${변수이름}_bar)

${변수이름} 구문은 아래와 같이 표준 bash 수정자(modifier)를 지원한다.

  • ${변수: -word} : 변수가 설정되어 있다면 지정한 변수를 출력한다. 변수가 설정되지 않았다면 word값을 출력한다.
  • ${변수: +word} : 변수가 설정되어 있다면 word를 출력한다. 변수가 설정되지 않았다면 지정한 변수를 출력한다.

ex)

variable=""
result=${variable:-대체값}
echo $result  
# 출력: 대체값 
# 왜냐하면, variable에 아무런 값이 설정되어 있지 않기 때문에 "대체값"이 화면에 출력된다. 
variable="완료"
result=${variable:+대체값}
echo $result  
# 출력: 대체값 
# 왜냐하면, variable에 값이 설정되어 있기 때문에 "대체값"이 화면에 출력된다. 

변수 앞에 Esacping 문자를 추가할 수 있다. (ex. \$foo 또는 \${foo} ⇒ 물론 각각의 변수들은 $foo 또는 ${foo}로 번역된다)

사용 예시

FROM busybox
ENV FOO=/bar
WORKDIR ${FOO}   # WORKDIR /bar
ADD . $FOO       # ADD . /bar
COPY \$FOO /quux # COPY $FOO /quux

Environment 변수는 아래 명령어들을 사용할 때 이용할 수 있다.

ADD
COPY
ENV
EXPOSE
FROM
LABEL
STOPSIGNAL
USER
VOLUME
WORKDIR
ONBUILD (when combined with one of the supported instructions above)

Environment 변수는 중간에 다른 값으로 교체할수 있다. 단, 다음과 같은 상황에서는 값이 바뀌지 않을 수도 있다.

ENV abc=hello
ENV abc=bye def=$abc
ENV ghi=$abc

3번째 줄까지 모두 수행하고 나면

  • abc는 bye라는 값을 저장한 변수가 된다.
  • def는 bye가 아닌 hello를 저장한 변수가 된다. 왜냐하면, abc 값의 교체가 같은 줄에서 실행되었기 때문이다.
  • ghi는 bye라는 값을 저장한 변수가 된다. abc 변수의 교체가 이전 줄에서 실행되었기 때문이다.