2026年7月14日
2026年7月14日
DockerのEntrypointとCMDの違いを解説
はじめに
Dockerは、アプリケーションを迅速かつ安定的にデプロイするためのツールとして広く使用されています。この中で、ENTRYPOINTとCMDは重要なコンテナ起動オプションであり、それぞれ異なる機能を持っています。ENTRYPOINTはコマンドライン引数を指定するために使用され、CMDはデフォルトの引数を提供します。両者の理解と適切な利用は、Dockerイメージの柔軟性と効率的な運用に貢献します。
症状・背景
1. コマンドライン引数の指定が必要な場合
- コンテナ起動時に異なる引数を必要とするアプリケーションがある場合。例えば、同じアプリケーションに対して異なる環境変数やコマンドライン引数を使用する必要があります。
- アプリケーションが実行される前に設定ファイルを読み込むためのスクリプトが必要な場合。
2. コンテナ間でのデフォルト値を共有したい場合
- デフォルトで同じ引数を指定したいが、起動時に上書きしたい場合。例えば、データベースのパスやポート番号などが適切な値に設定されるようにする。
3. シングルコマンドとマルチステージビルドが必要な場合
- Dockerイメージを作成する際に複数のステージを必要とする場合。
ENTRYPOINTとCMDを使うことで、これらのステージ間で一貫したコマンドライン引数を提供できます。
4. アプリケーション起動の柔軟性を高めたい場合
- デフォルト値を提供しつつも、起動時に異なるオプションを使用できるようにしたい場合。例えば、開発と本番環境で異なる設定が必要なアプリケーション。
手順・設定方法
ステップ1: Dockerfileを作成する
# Dockerfile
FROM node:alpine
COPY . /app
WORKDIR /app
ENTRYPOINT ["npm", "start"]
この例では、npm startコマンドを実行し、その引数は後で指定できるようにします。
ステップ2: コンテナ起動時にオプションを追加する
# 実際のコマンド
docker run -it my-node-app --production=true
この例では、--production=trueがnpm startコマンドに渡されます。
ステップ3: カスタムエントリーポイントとCMDを組み合わせる
# Dockerfile
FROM node:alpine
COPY . /app
WORKDIR /app
ENTRYPOINT ["./my-script.sh"]
CMD ["arg1", "arg2"]
この例では、my-script.shが実行され、デフォルトの引数はarg1 arg2です。
ステップ4: コンテナ起動時にカスタムエントリーポイントとCMDを上書きする
# 実際のコマンド
docker run -it my-node-app --production=true ./my-script.sh "override arg1" "override arg2"
この例では、./my-script.shが実行され、デフォルトの引数は上書きされて"override arg1" "override arg2"となります。
注意事項
ENTRYPOINTとCMDを組み合わせた場合、docker runコマンドでオプションを指定する必要があることに注意してください。CMDの引数はENTRYPOINTが実行される際に渡されます。ただし、ENTRYPOINTがsh -cを使うとCMDの引数は直接的な影響を受けません。
まとめ
1. ENTRYPOINT: コンテナ起動時に固定的なコマンドラインを提供し、その引数は後でオーバーライドできるようにします。
2. CMD: ENTRYPOINTが実行される際にデフォルトの引数を提供します。ただし、docker runコマンドで上書きできます。
3. コンテナ間での一貫性: 両方を使用することで、異なるコンテナ間でも共通の起動オプションや引数を共有することができます。
4. フレキシブルなデプロイメント: シングルコマンドとマルチステージビルドで柔軟にアプリケーションをデプロイできます。
関連記事: