lulu

【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"]