우노
[Docker] CMD, ENTRYPOINT 지시문에 “sh -c”를 추가하는 이유 본문
들어가기 앞서,
- 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.
'DevOps > Docker' 카테고리의 다른 글
[Docker] Mac OS 환경에서 IntelliJ의 Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running? 해결하기 (0) | 2023.09.20 |
---|---|
[Docker] 컨테이너 실행 상태 유지 지시문(CMD, ENTRYPOINT) (0) | 2023.09.20 |
[Docker] Dockerfile에서 Private Repo Clone하는 방법 (0) | 2023.06.10 |
[Docker] docker build 시 Dockerfile 경로 지정 (0) | 2023.03.18 |
[Docker] CMD, ENTRYPOINT 차이 (0) | 2023.02.18 |
Comments