FROM traefik:camembert-alpine COPY traefik.toml /etc/traefik/traefik.toml 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"]
What is toml?
https://github.com/toml-lang/toml/blob/master/versions/ko/toml-v0.4.0.md
2013년 2월 Github의 창업자이자 CEO인 Tom Preston-Werner가 TOML이라는 파일 형식을 공개했다(정적 블로그 사이트 생성기인 Jekyll로도 알려져 있다). 개인적인 느낌으로는 다른 대안보다는 일단 텍스트 자체의 생김새에서 출발해서 정리해 나간 느낌이다.
2월 23일자로 repo가 만들어졌으니 정말 최근인데, 처음에는 이름이 Tom’s Own Markup Language이더니 지금은 Tom’s Obvious, Minimal Language의 약자이다. 이 양반 회사 차릴 만한 게 TomDoc이라고 루비용으로 RubyDoc 비슷한 걸 만들면서도 자기 이름을 땄다. Github 사람이 만들다 보니 벌써 Github에서 문법 강조가 지원된다. 거기다 처음 봤을 때는 며칠 전에 봤을 때 파서가 루비, 파이선 정도이더니 며칠 새 수십 개가 됐다. 간단히 특징을 정리하면 다음과 같다.
- 윈도 INI 파일과 비슷하다: INI 파일 규격에는 없지만 흔히 사용하던
[a.b.c]
같은 계층화된 섹션 같은 아이디어를 명시적으로 들여왔다. - 파싱을 하면 일관되게 맵으로 대응된다.
- 리스트 내 리스트는 중첩할 수 있지만 리스트 내에 맵을 중첩할 수 없다: 이 때문에 XML에서 흔히 하던 몇 가지를 표현 하는 게 조금 성가시다. 예를 들면 Maven에서 dependency를 여러 개 지정한다든지 할 때가 그렇다.
- 들여쓰기는 의미는 없지만 원하면 들여쓰기를 해도 된다.
- 기타 데이터 형식은 매우 단순하다: 일례로 날자도 딱 한 형태만 지원한다.
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