FROM traefik:camembert-alpine COPY traefik.toml /etc/traefik/traefik.toml #참조: http://wiki.thesanse.com/pages/viewpage.action?pageId=7340484 ENTRYPOINT ["traefik"]
logLevel = "INFO" [web] address = ":8080" [entryPoints] [entryPoints.http] address = ":80" [file] [backends] [backends.backend1] [backends.backend1.loadbalancer] method = "wrr" sticky = true [backends.backend1.servers.server1] url = "http://front-end:8079" [frontends] [frontends.frontend1] backend = "backend1" entrypoints = ["http"]
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 update
와install
을 함께 실행해 주자.
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