デフォルトコマンドを指定したい(CMD

1CMD ["python", "app.py"]

CMDでコンテナー起動時のデフォルトコマンドを指定します。 コンテナー実行時にコマンドを省略できます。

デフォルトコマンドを指定したい(exec形式)

1CMD ["python", "app.py"]

exec形式を使うことで、シェルを経由せずにコマンドを直接実行します。

特徴:

  • 配列形式で指定

  • シェルを経由しないため高速

  • シェル変数展開が行われない

  • 推奨形式

デフォルトコマンドを指定したい(シェル形式)

1CMD python app.py

シェル形式を使うことで、シェル機能(パイプ、リダイレクトなど)が利用できます。

特徴:

  • 文字列形式で指定

  • シェルを経由して実行

  • シェル変数展開が可能

  • パイプやリダイレクトが使える

Pythonアプリケーションを実行したい

1FROM python:3.12-slim
2WORKDIR /app
3
4COPY requirements.txt ./
5RUN pip install --no-cache-dir -r requirements.txt
6
7COPY . .
8
9CMD ["python", "app.py"]

Pythonスクリプトをコンテナー起動時に実行します。

実行方法:

1# デフォルトコマンドで起動(CMDで指定したコマンドが実行)
2docker run myimage
3
4# CMDを上書きして別のコマンドを実行
5docker run myimage python other_script.py

Node.jsアプリケーションを実行したい

1FROM node:18-alpine
2WORKDIR /app
3
4COPY package.json package-lock.json ./
5RUN npm ci --omit=dev
6
7COPY . .
8
9CMD ["node", "index.js"]

Node.jsアプリケーションをコンテナー起動時に実行します。

ENTRYPOINTとCMDの違い

1# CMD のみ
2CMD ["echo", "hello"]
3
4# ENTRYPOINT + CMD
5ENTRYPOINT ["echo"]
6CMD ["hello"]

CMD のみの場合:

1docker run myimage          # hello と出力
2docker run myimage world    # world と出力(CMDが上書きされる)

ENTRYPOINT + CMD の場合:

1docker run myimage          # echo hello と出力
2docker run myimage world    # echo world と出力(CMDのみが上書きされる)

CMD:

  • コンテナー起動時のデフォルトコマンド

  • 実行時に完全に上書きできる

  • 単独でも、ENTRYPOINTと共に使用できる

ENTRYPOINT:

  • コンテナーの「実行ファイル」として機能

  • 実行時に上書きできない(通常)

  • CMDはENTRYPOINTの引数として機能

注意事項

注釈

Dockerfile内で複数のCMDを指定した場合、最後のものだけが有効になります。 他のすべてのCMDは無視されます。

警告

シェル形式でCMDを指定する場合、PID 1(メインプロセス)がシェルになります。 Dockerコンテナー内ではシグナル転送が正常に機能しないため、 exec形式を使用することを推奨します。

リファレンス