RUN

보통 이미지 위에 다른 패키지(프로그램)를 설치하고 새로운 레이어를 생성할 때 사용한다. 다음은 ubuntu 이미지 위에 curl을 설치하는 예제이다.

FROM ubuntu:14.04
RUN apt-get update
RUN apt-get install -y curl

RUN 명령을 실행할 때 마다 레이어가 생성되고 캐시된다. 따라서, 위와 같이 RUN 명령을 따로 실행하면 apt-get update는 다시 실행되지 않아서 최신 패키지를 설치할 수 없다. 아래처럼 RUN 명령 하나에 apt-get updateinstall을 함께 실행해 주자.

FROM ubuntu:14.04
RUN apt-get update && apt-get install -y \
    curl \
    nginx \
&& rm -rf /var/lib/apt/lists/*


CMD

CMD docker run 실행 시 명령어를 주지 않았을 때 사용할 default 명령을 설정하거나, ENTRYPOINT의 default 파라미터를 설정할 때 사용한다. CMD 명령의 주용도는 컨테이너를 실행할 때 사용할 default를 설정하는 것이다. CMD 명령은 3가지 형태가 있다.

  • CMD [“executable”,”param1”,”param2”] (exec form, this is the preferred form)
  • CMD [“param1”,”param2”] (as default parameters to ENTRYPOINT)
  • CMD command param1 param2 (shell form)
FROM ubuntu
CMD echo "This is a test."

위와 같이 Dockerfile을 만들었을 때, docker run 실행 시 아무런 커맨드를 주지 않으면 CMD 명령이 실행된다.

$ docker run -it --rm <image-name>
This is a test
$

하지만, echo "Hello" 라고 실행할 커맨드를 주게 되면 CMD는 무시되고 커맨드가 실행된다.

$ docker run -it --rm <image-name> echo "Hello"
Hello
$


ENTRYPOINT

ENTRYPOINT는 2가지 형태를 가지고 있다.

  • ENTRYPOINT [“executable”, “param1”, “param2”] (exec form, preferred)
  • ENTRYPOINT command param1 param2 (shell form)

docker run 실행 시 실행되는 명령이라고 생각해도 좋을 것 같다.

FROM ubuntu
ENTRYPOINT ["/bin/echo", "Hello"]
CMD ["world"]

위 Dockerfile의 내용을 실행하면 CMD에서 설정한 default 파라미터가 ENTRYPOINT에서 사용된다. docker run명령 실행 시 파라미터를 주면 CMD에서 설정한 파라미터는 사용되지 않는다.

$ docker run -it --rm <image-name>
Hello world
$ docker run -it --rm <image-name> ME
Hello ME
$

shell form 으로 실행해야만 변수 등이 대체(substitution)된다.

FROM ubuntu
ENTRYPOINT [ "echo", "$HOME" ]
$ docker run -it --rm <image-name>
$HOME
$

위처럼 exec form으로 사용하면 $HOME 이 그대로 사용되고, 아래처럼 shell form으로 사용하면 변수 등이 변환된다.

FROM ubuntu
ENTRYPOINT echo $HOME
$ docker run -it --rm <image-name>
/root
$

CMD ENTRYPOINT의 조합은 ENTRYPOINT / CMD combinations에 표로 잘 정리되어 있다.




정리

그럼 CMD와 ENTRYPOINT는 어떤 경우에 사용해야 효과적일까?
ENTRYPOINT
 - 배포할 docker가 실행되면서 항상 수행해야하는 명령어 지정
 - 웹서버, db 등 프로세스가 항상 구동되는 경우
CMD
 - docker를 배포하는 시점 및 환경에 따라 command를 다양하게 지정해야 하는 경우.

[출처] [docker] RUN vs CMD vs ENTRYPOINT|작성자 freepsw


  • No labels
Write a comment…