デフォルトコマンドを指定したい(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形式を使用することを推奨します。