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