Docker

[Docker] Docker References - CMD

patrick-star 2023. 9. 15. 23:25
728x90
  • CMD 명령어(instruction) 형식
    CMD ["executable","param1","param2"] (exec 형식, 이 형식을 더 선호된다)
    

CMD ["param1","param2"] (ENTRYPOINT에 대한 기본 파라미터)

CMD command param1 param2 (shell 형식)


Dockerfile에는 오직 하나의 `CMD 명령어`만 존재할 수 있다. 만약, 1개 이상의 CMD 가 있다면, 가장 마지막에 있는 CMD가 동작한다. 

`CMD의 주요 목적`은 실행하고 있는 컨테이너에 기본값을 제공하는 것이다. 이 기본값들은 `executable`을 포함하거나 생략할 수 있다. 
(물론, 생략하는 경우에는 ENTRYPOINT instruction을 확정해야 한다) 

만약에 CMD가 ENTRYPOINT 명령어에 대해 기본적인 argument를 제공한다면 CMD와 ENTRYPOINT 둘 다 JSON 포맷으로 확정되어야 한다.

마찬가지로 exec form은 shell을 호출하지 않기 때문에 `$HOME`과 같이 `shell 형식에서만 동작하는 명령어들`은 동작하지 않는다. 
만약에 shell을 이용해서 처리하고 싶다면 직접 shell을 사용하거나 shell을 execute하면 된다. (ex. `CMD ["sh", "-c", "echo $HOME"]`)

CMD 명령어는 이미지(image)가 동작할 때 실행되어야 하는 command를 설정한다. 

ex) 

FROM ubuntu
CMD echo "This is a test." | wc - # shell 명령어 형식

또는

CMD ["/usr/bin/wc","--help"] # JSON Array 형식 - 이 형식이 좀 더 선호된다.

```

만약, 컨테이너가 똑같은 executable을 매번 실행하도록 하고 싶다면, CMD와 함께 ENTRYPOINT를 사용하는 것을 고려해야 한다.

  • RUN과 CMD 비교
    • RUN : 커맨드를 실행해서 결과를 커밋하는 역할을 한다.
    • CMD : 빌드 시에는 아무 동작을 하지 않지만 이미지에 대한 커맨드를 지정한다.