[Docker] RUN vs CMD vs ENTRYPOINT in Dockerfile
ํท๊ฐ๋ฆฌ๊ธฐ ์ฌ์ด Docker Dockerfile ๋ช
๋ น์ด, RUN, CMD, ENTRYPOINT. ๋ชจ๋ ๋ญ๊ฐ ์คํํ๋ ๋ช
๋ น์ด์ด๋ค.
RUN. ์๋ก์ด ๋ ์ด์ด์์ ๋ช
๋ น์ด๋ฅผ ์คํํ๊ณ , ์๋ก์ด ์ด๋ฏธ์ง๋ฅผ ์์ฑํ๋ค. ๋ณดํต ํจํค์ง ์ค์น ๋ฑ์ ์ฌ์ฉ๋๋ค. e.g. apt-get
CMD. default ๋ช
๋ น์ด๋ ํ๋ผ๋ฏธํฐ๋ฅผ ์ค์ ํ๋ค. docker run ์คํ ์ ์คํํ ์ปค๋งจ๋๋ฅผ ์ฃผ์ง ์์ผ๋ฉด ์ด default ๋ช
๋ น์ด ์คํ๋๋ค. ๊ทธ๋ฆฌ๊ณ ENTRYPOINT์ ํ๋ผ๋ฏธํฐ๋ฅผ ์ค์ ํ ์๋ ์๋ค.ย CMD์ ์ฃผ์ฉ๋๋ ์ปจํ
์ด๋๋ฅผ ์คํํ ๋ ์ฌ์ฉํ default๋ฅผ ์ค์ ํ๋ ๊ฒ์ด๋ค.
ENTRYPOINT. ์ปจํ
์ด๋๋ฅผ ์คํํ ์ ์๊ฒ ์ค์ ํ๋ค.
๋ณดํต ์ด๋ฏธ์ง ์์ ๋ค๋ฅธ ํจํค์น(ํ๋ก๊ทธ๋จ)๋ฅผ ์ค์นํ๊ณ ์๋ก์ด ๋ ์ด์ด๋ฅผ ์์ฑํ ๋ ์ฌ์ฉํ๋ค. ๋ค์์ 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๋ 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
$
CMD๋ ์ฌ๋ฌ๋ฒ ์ฌ์ฉํ ์ ์์ง๋ง ๊ฐ์ฅ ๋ง์ง๋ง์ ์๋ CMD ๋ฑ 1๊ฐ๋ง ๋จ๊ฒ ๋๋ค. (override)ย ENTRYPOINT์ default ํ๋ผ๋ฏธํฐ๋ ์๋ 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์ ํ๋ก ์ ์ ๋ฆฌ๋์ด ์๋ค.
- ์ฐธ๊ณ
http://goinbigdata.com/docker-run-vs-cmd-vs-entrypoint/
https://docs.docker.com/engine/reference/builder/
https://docs.docker.com/engine/userguide/eng-image/dockerfile_best-practices/