DockerfileにおけるCMDの記述形式の違い
Dockerfileに記述するCMD
には、シェル形式とExec形式の2つの記述方法があります。それぞれの違いや特徴を詳しく解説します。
1. シェル形式
以下のように記述します:
CMD node server.js
特徴
- 実行時に
/bin/sh -c
を介してコマンドが実行されます。 - 実際には以下のように解釈されます:
/bin/sh -c "node server.js"
- シェルの機能(環境変数展開、パイプ、リダイレクトなど)を利用できます。
- シェルのオーバーヘッドが発生するため、Exec形式よりわずかに遅い場合があります。
2. Exec形式
以下のように配列形式で記述します:
CMD ["node", "serve.js"]
特徴
- コマンドが直接実行されます(シェルを介しません)。
- 実際には以下のように解釈されます:
node serve.js
- シェルの機能(パイプやリダイレクト)は使えませんが、シンプルで安全です。
- オーバーヘッドが少なく、意図した動作が保証されやすい。
シェル形式とExec形式の違い
特徴 | シェル形式 (CMD node server.js ) |
Exec形式 (CMD ["node", "serve.js"] ) |
---|---|---|
実行方法 |
/bin/sh -c 経由で実行 |
直接コマンドが実行 |
シェルの利用可否 | 可能(環境変数展開、パイプなどが利用可) | 不可 |
実行速度 | 若干遅い(シェルオーバーヘッドあり) | 速い(直接実行) |
意図した動作の保証性 | シェルの解釈に依存することがある | 高い(シンプルで予測可能) |
使用例
シェル形式の例
複数コマンドを実行したり、シェル機能を使用する場合に便利です:
CMD node server.js && echo "Server started"
Exec形式の例
シンプルかつ安全な方法でコマンドを実行する際に使用します:
CMD ["node", "server.js"]
どちらを使うべきか?
-
基本的にはExec形式を推奨します。
- 実行速度が速く、安全で意図した動作を保証しやすい。
- 環境変数展開やリダイレクト、パイプなどシェルの機能が必要な場合はシェル形式を選びましょう。
まとめ
DockerfileでCMD
を記述する際は、用途に応じてシェル形式とExec形式を使い分けることが重要です。シンプルなコマンド実行にはExec形式を、複雑なシェル機能が必要な場合にはシェル形式を選ぶようにすると良いでしょう。
関連動画