RUN으로 기본 셸 변경

Dockerfile의 기본 셸을 바꿀 때는 SHELL 지시어로 명시하세요.

설명

이후 셸 형식 명령에 사용할 기본 셸을 바꾸려는 목적이라면 RUN 명령으로 우회하지 말고 SHELL 지시어를 사용해야 합니다. RUN은 개별 명령 실행용이라 기본 셸 변경 의도를 명확하게 표현하지 못합니다.

셸 실행 파일의 링크를 바꾸면 이를 사용하는 다른 스크립트에도 영향을 줄 수 있고, 이후 명령이 어떤 셸 환경에서 실행되는지 혼동하게 만듭니다. Dockerfile은 선언적으로 작성하는 편이 유지보수와 검증에 유리합니다.

잠재적 영향

  • Dockerfile 의도가 불명확해져 유지보수가 어려워집니다.
  • 빌드 단계마다 셸 동작이 달라질 수 있어 오류를 만들기 쉽습니다.
  • 이미지 빌드 과정을 검토할 때 실수나 오해가 생길 수 있습니다.

해결 방법

  • 기본 셸을 바꿔야 하면 SHELL ["..."] 지시어를 사용하세요.
  • RUN ln -sf ... 같은 우회 방식으로 기본 셸을 바꾸지 마세요.
  • 셸 변경이 꼭 필요한지 검토하고, 필요할 때만 명시적으로 선언하세요.

예시

Bash가 /bin/bash에 설치된 Linux 이미지의 발췌입니다. SHELL은 이후 셸 형식의 RUN, CMD, ENTRYPOINT에 적용되며 사용자의 로그인 셸을 바꾸지는 않습니다.

변경 전

dockerfile
RUN ln -sfv /bin/bash /bin/sh

변경 후

dockerfile
SHELL ["/bin/bash", "-c"]

설명:

  • 변경 전: RUN으로 셸 링크를 바꿔 기본 셸 변경 의도가 숨겨지고 관리가 어려워집니다.
  • 변경 후: SHELL 지시어로 이후 명령이 어떤 셸에서 실행되는지 분명하게 선언합니다.

참조