lulu

【Docker】RailsのENTRYPOINTのentrypoint.shがやっていることを調べてみる

やること

RailsのDockerfileによくでてくる、ENTRYPOINTのentrypoint.shがなにをやっているのかを調べました

対象の記述

Dockerfile

...

COPY entrypoint.sh /usr/bin/
RUN chmod +x /usr/bin/entrypoint.sh
ENTRYPOINT ["entrypoint.sh"]
EXPOSE 3000

CMD ["bundle", "exec", "rails", "server", "-b", "0.0.0.0", "-p", "3000"]

このような形で、ENTRYPOINTでentrypoint.shを実行し、最後にCMD命令を行っている

ENTRYPOINTとCMDの併用

こちらで解説

挙動

ENTRYPOINT命令とCMD命令を併用しているので、ENTRYPOINTの引数にCMD命令を渡していることがわかる

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 "$@"

pumaの起動が失敗しないように既に起動しているプロセスをkillしてから、execコマンドを実行している。
そして、execコマンドに"$@"を渡しているので、引数(CMD命令の中身)を最後に実行するということがわかる。
位置パラメータについて

結論

entrypoint.shで様々なshellを実行したあとに、puma(アプリケーション・サーバー)を起動するCMD命令を実行している