Dockerfile の CMD と ENTRYPOINT の違いと同時定義時の挙動¶
CMD と ENTRYPOINT の比較¶
| 命令 | 役割 | 実行時の上書き | 主な用途 |
|---|---|---|---|
| CMD | コンテナのデフォルトコマンド(引数)を指定 | docker run image <cmd> で上書き可能 |
デフォルト引数の設定 |
| ENTRYPOINT | コンテナの実行バイナリを固定 | --entrypoint フラグでのみ上書き |
コンテナをコマンドのように使う |
同時定義した場合の挙動¶
ENTRYPOINT と CMD を両方定義すると、CMD の内容が ENTRYPOINT の引数として渡される。
フォームの違い(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 を正しく受け取れる