DockerのENTRYPOINTとCMDを確認する

ENTRYPOINT

shell形式

ENTRYPOINTにコマンドを指定。

$ vi Dockerfile
FROM debian
ENTRYPOINT echo entrypoint1
$ docker build -t hoge .

実行すると、ENTRYPOINTで指定したコマンドが実行される。

$ docker run hoge
entrypoint1

exec形式

ENTRYPOINTにコマンドを配列の形式で指定。

$ vi Dockerfile
FROM debian
ENTRYPOINT ["echo", "entrypoint1"]
$ docker build -t hoge .

同様に実行される。

$ docker run hoge
entrypoint1

上書き

entrypointオプションで変更できるらしいので、指定してみるが、実行可能な形式のファイルでない、と怒られる。

$ docker run --entrypoint "echo entrypoint2" hoge
docker: Error response from daemon: OCI runtime create failed: container_linux.go:370: starting container process caused: exec: "echo entrypoint3": executable file not found in $PATH: unknown.

よく分かってないが、とりあえず、シェルを作成し、

$ vi docker-entrypoint.sh
#!/bin/sh
echo entrypoint2

Dockerfile内でコピーするよう修正。

$ vi Dockerfile
FROM debian

COPY docker-entrypoint.sh /usr/local/bin/
RUN chmod +x /usr/local/bin/docker-entrypoint.sh

ENTRYPOINT ["echo", "entrypoint1"]
$ docker build -t hoge .

これで、上書きできるようになった。

$ docker run hoge
entrypoint1

$ docker run --entrypoint docker-entrypoint.sh hoge
entrypoint2

CMD

shell形式

CMDにコマンドを指定。

$ vi Dockerfile
FROM debian
CMD echo cmd1
$ docker build -t hoge .

実行すると、CMDで指定したコマンドが実行される。

$ docker run hoge
cmd1

exec形式

CMDにコマンドを配列の形式で指定。

$ vi Dockerfile
FROM debian
CMD ["echo", "cmd1"]
$ docker build -t hoge .

同様に実行される。

$ docker run hoge
cmd1

上書き

CMDの内容は、runにコマンドを指定することで変更できる。

$ docker run hoge echo cmd2
cmd2

併用した場合

shell形式

$ vi Dockerfile
FROM debian
ENTRYPOINT echo entrypoint1
CMD echo cmd1 
$ docker build -t hoge .

ENTRYPOINTのコマンドだけ実行される。

$ docker run hoge
entrypoint1

exec形式

$ vi Dockerfile
FROM debian
ENTRYPOINT ["echo", "entrypoint1"]
CMD ["echo", "cmd1"]
$ docker build -t hoge .

ENTRYPOINTのコマンドの後ろに、CMDの内容が引数として設定され、実行される。

$ docker run hoge
entrypoint1 echo cmd1

上書き

runコマンドに引数を指定すると、ENTRYPOINTに渡されるCMDの内容も変わる。

$ docker run hoge echo hoge2
entrypoint1 echo hoge2

補足

entrypointのシェルで、execで引数を実行するように指定し、

$ vi docker-entrypoint.sh
#!/bin/sh
echo entrypoint1

exec "$@"

DockerfileのENTRYPOINTで、このシェルを指定。

$ vi Dockerfile
FROM debian

COPY docker-entrypoint.sh /usr/local/bin/
RUN chmod +x /usr/local/bin/docker-entrypoint.sh

ENTRYPOINT ["docker-entrypoint.sh"]
CMD ["echo", "cmd1"]
$ docker build -t hoge .

こうすると、ENTRYPOINTに渡されたCMDが実行できる。

$ docker run hoge
entrypoint1
cmd1

$ docker run hoge echo cmd2
entrypoint1
cmd2