Dockerfile 자세히 알아보기

이재홍 http://www.pyrasis.com 2014.08.02 ~ 2014.09.20

ENTRYPOINT

ENTRYPOINT는 컨테이너가 시작되었을 때 스크립트 혹은 명령을 실행합니다. 즉 docker run 명령으로 컨테이너를 생성하거나, docker start 명령으로 정지된 컨테이너를 시작할 때 실행됩니다. ENTRYPOINT는 Dockerfile에서 단 한번만 사용할 수 있습니다.

셸(/bin/sh)로 명령 실행하기

Dockerfile

ENTRYPOINT touch /home/hello/hello.txt

ENTRYPOINT <명령> 형식이며 셸 스크립트 구문을 사용할 수 있습니다. FROM으로 설정한 이미지에 포함된 /bin/sh 실행 파일을 사용하게 되며 /bin/sh 실행 파일이 없으면 사용할 수 없습니다.

셸 없이 바로 실행하기

Dockerfile

ENTRYPOINT ["/home/hello/hello.sh"]

Dockerfile

ENTRYPOINT ["/home/hello/hello.sh", "--hello=1", "--world=2"]

ENTRYPOINT ["<실행 파일>", "<매개 변수1>", "<매개 변수2>"] 형식입니다. 실행 파일과 매개 변수를 배열 형태로 설정합니다. FROM으로 설정한 이미지의 /bin/sh 실행 파일을 사용하지 않는 방식입니다. 셸 스크립트 문법이 인식되지 않으므로 셸 스크립트 문법과 관련된 문자를 그대로 실행 파일에 넘겨줄 수 있습니다.

CMD와 ENTRYPOINT는 컨테이너가 생성될 때 명령이 실행되는 것은 동일하지만 docker run 명령에서 동작 방식이 다릅니다.

다음과 같이 Dockerfile에서 CMD로 echo 명령을 사용하여 hello를 출력합니다.

Dockerfile

FROM ubuntu:latest
CMD ["echo", "hello"]

컨테이너를 생성할 때 docker run <이미지> <실행할 파일> 형식인데 이미지 다음에 실행할 파일을 설정할 수 있습니다. docker run 명령에서 실행할 파일을 설정하면 CMD는 무시됩니다.

$ sudo docker build --tag example .
$ sudo docker run example echo world
world

CMD ["echo", "hello"]는 무시되고 docker run 명령에서 설정한 echo world가 실행되어 world가 출력되었습니다. docker run 명령에서 설정한 <실행할 파일>과 Dockerfile의 CMD는 같은 기능입니다.

이제 ENTRYPOINT입니다. 다음과 같이 Dockerfile에서 ENTRYPOINT로 echo 명령을 사용하여 hello를 출력합니다.

Dockerfile

FROM ubuntu:latest
ENTRYPOINT ["echo", "hello"]

Dockerfile을 빌드하여 docker run 명령으로 실행합니다. docker run 명령에서 실행할 파일을 설정하면 ENTRYPOINT 무시되지 않고, 실행할 파일 설정 자체를 매개 변수로 받아서 처리합니다.

$ sudo docker build --tag example .
$ sudo docker run example echo world
hello echo world

ENTRYPOINT ["echo", "hello"]에서 echo hello가 실행되어 hello가 출력되고, docker run 명령에서 설정한 내용이 ENTRYPOINT ["echo", "hello"]의 매개 변수로 처리되어 echo world도 함께 출력됩니다. 셸에서는 다음과 같이 표현할 수 있습니다.

$ echo hello echo world
hello echo world

echo 명령 아닌 다른 방식으로 실행해봅니다. 다음과 같이 1 2 3 4를 넘겨주면 그대로 1 2 3 4가 출력됩니다.

$ sudo docker run example 1 2 3 4
hello 1 2 3 4

ENTRYPOINT는 docker run 명령에서 --entrypoint 옵션으로도 설정할 수 있습니다. --entrypoint 옵션으로 cat을 실행하고 /etc/hostname 파일의 내용을 출력합니다.

$ sudo docker run --entrypoint="cat" example /etc/hostname
9efe43ea4d40

--entrypoint 옵션을 설정하면 Dockerfile에 설정한 ENTRYPOINT는 무시됩니다.


저작권 안내

이 웹사이트에 게시된 모든 글의 무단 복제 및 도용을 금지합니다.
  • 블로그, 게시판 등에 퍼가는 것을 금지합니다.
  • 비공개 포스트에 퍼가는 것을 금지합니다.
  • 글 내용, 그림을 발췌 및 요약하는 것을 금지합니다.
  • 링크 및 SNS 공유는 허용합니다.

Published

30 November 2014