【Docker】ENTRYPOINTとCMDを併用したときの動作を検証しました
やること
DockerfileでENTRYPOINTとCMDを併用したときの動作を調べました。
ENTRYPOINTとCMDの併用したDockerfile
$ cat Dockerfile
FROM centos:latest
ENTRYPOINT [ "curl" ]
CMD ["-i", "-s", "magical-academia.com"]
$ docker build . -t test-entrypoint
$ docker run test-entrypoint
HTTP/1.1 308 Permanent Redirect
Date: Sat, 19 Jun 2021 05:42:35 GMT
Content-Type: text/plain
Transfer-Encoding: chunked
Connection: keep-alive
Location: https://magical-academia.com/
Refresh: 0;url=https://magical-academia.com/
server: Vercel
x-vercel-id: hnd1::t8cq4-1624081355950-1e9fe8d20c13
Redirecting to https://magical-academia.com/ (308)
結果
ENTRYPOINTとCMDを併用して使うと、ENTRYPOINTの引数としてCMDの内容が実行されるということがわかりました。
有効な使い方
以下のような、ENTRYPOINT用のshellファイル等を作成し、
#!/bin/bash
set -e
# 行いたい処理を記述する
...
# CMD構文の内容を実行する
exec "$@"
このファイルをENTRYPOINT命令で実行するようにDockerfileを作成すれば、複数の処理を行ったあとにCMD命令が実行できますね。
ex: railsのpuma起動でよくある形
entrypoint.sh
#!/bin/bash
set -e
# Remove a potentially pre-existing server.pid for Rails.
rm -f tmp/pids/server.pid
# Then exec the container's main process (what's set as CMD in the Dockerfile).
exec "$@"
Dockerfile
FROM centos:latest
COPY entrypoint.sh /usr/bin/
RUN chmod +x /usr/bin/entrypoint.sh
ENTRYPOINT ["entrypoint.sh"]
CMD ["bundle", "exec", "rails", "server", "-b", "0.0.0.0", "-p", "3000"]