설명
이후 셸 형식 명령에 사용할 기본 셸을 바꾸려는 목적이라면 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지시어로 이후 명령이 어떤 셸에서 실행되는지 분명하게 선언합니다.