오늘의 인기 글
최근 글
최근 댓글
Today
Total
11-15 01:02
관리 메뉴

우노

[Docker] CMD, ENTRYPOINT 지시문에 “sh -c”를 추가하는 이유 본문

DevOps/Docker

[Docker] CMD, ENTRYPOINT 지시문에 “sh -c”를 추가하는 이유

운호(Noah) 2023. 9. 20. 13:44

들어가기 앞서,

  • Dockerfile 하단 CMD, ENTRYPOINT 지시문 앞에 “sh -c”를 추가하는 경우가 있습니다.
  • 실제로 CMD, ENTRYPOINT 지시문은 “sh -c” 추가 여부에 따라 실행 방식에 차이가 발생하게 됩니다.
  • 해당 포스팅에선, 실행 방식에 따른 차이에 대해서 설명하겠습니다.

지시문 앞에 “sh -c”를 추가하는 경우

FROM ubuntu

CMD ["sh", "-c", "mkdir test && tail -f /dev/null"]
  • 원하는 작업은, "mkdir test” 명령어로 test 폴더를 생성하고 "tail -f /dev/null” 명령어로 컨테이너 실행 상태를 유지하는 것입니다.
  • 만약, 지시문 앞에 “sh -c”를 추가한다면 해당 명령어는 원하는 의도대로 실행됩니다.
  • 셸 내에서 명령어 문자열이 해석되기 때문에, && 연산자와 두 가지 명령어가 정상적으로 인식됩니다.

지시문 앞에 “sh -c”를 추가하지 않는 경우

FROM ubuntu

CMD ["mkdir test && tail -f /dev/null"]
  • 하지만, 지시문 앞에 “sh -c”를 추가하지 않는다면, 해당 명령어는 하나의 명령어로 간주됩니다.

  • 즉, ‘mkdir’가 메인 명령어가 되고 나머지 “test && tail -f /dev/null”가 인자가 됩니다.

  • 따라서, && 연산자가 셸에서 인식되지 않기 때문에, 아래와 같은 에러가 발생하게 됩니다.

      docker: Error response from daemon: failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: exec: "mkdir test && tail -f /dev/null": stat mkdir test && tail -f /dev/null: no such file or directory: unknown.
Comments