コンテンツにスキップ

Dockerfile の CMD と ENTRYPOINT の違いと同時定義時の挙動

CMD と ENTRYPOINT の比較

命令 役割 実行時の上書き 主な用途
CMD コンテナのデフォルトコマンド(引数)を指定 docker run image <cmd> で上書き可能 デフォルト引数の設定
ENTRYPOINT コンテナの実行バイナリを固定 --entrypoint フラグでのみ上書き コンテナをコマンドのように使う

同時定義した場合の挙動

ENTRYPOINT と CMD を両方定義すると、CMD の内容が ENTRYPOINT の引数として渡される。

ENTRYPOINT ["python"]
CMD ["app.py"]
# → 実行されるコマンド: python app.py
# docker run image script.py と実行した場合
# CMDが上書きされ: python script.py

フォームの違い(exec 形式 vs shell 形式)

形式 シグナルの扱い
exec 形式(推奨) ["python", "app.py"] PID 1 として直接起動。SIGTERM が届く
shell 形式 python app.py /bin/sh -c 経由。SIGTERM が届かないことがある

典型的なパターン

# パターン 1: ツールとしてのコンテナ(ENTRYPOINT のみ)
ENTRYPOINT ["git"]
# docker run image log --oneline → git log --oneline

# パターン 2: デフォルト付きサービス
ENTRYPOINT ["python", "-m", "gunicorn"]
CMD ["app:application", "--bind", "0.0.0.0:8000"]

# パターン 3: CMD のみ(シンプルなケース)
CMD ["python", "app.py"]

要点

  • CMD はデフォルト引数。docker run で簡単に上書きできる

  • ENTRYPOINT は実行バイナリを固定。コンテナをコマンドとして使いたいときに使う

  • 両方定義すると CMD が ENTRYPOINT の引数になる(上書き可能な引数付きコンテナ)

  • 本番では exec 形式を使うことで SIGTERM を正しく受け取れる