CMDとENTRYPOINTのJSON形式未使用

CMDとENTRYPOINTの引数を明示し、終了シグナルの処理を確認してください。

説明

CMDとENTRYPOINTをJSON配列で指定しないと、シェルを介して実行され、引数の解釈が変わる場合があります。終了シグナルの転送やプロセス制御も、意図と異なる動作になる可能性があります。

コンテナーでは、メインプロセスを安定して起動・終了できることが重要です。実行ファイルと引数をJSON配列で明示してください。シェルの機能が必要な場合は意図的に使用し、最終的なプロセスにシグナルが届くことを確認してください。

想定される影響

  • 終了シグナルが対象プロセスに届かない場合があります。
  • 引数の解釈が変わり、想定外の実行結果になる可能性があります。
  • コンテナーの停止や再起動時に運用上の問題が起こるおそれがあります。

対処方法

  • CMD ["python", "/app/app.py"]のようにJSON配列を使ってください。
  • ENTRYPOINTも同じ形式で指定し、暗黙のシェル依存を減らしてください。
  • 既存の文字列形式のコマンドと、意図した動作を確認してください。

例

top -bに対応するLinuxイメージの抜粋です。exec形式のCMDは、ENTRYPOINTの後ろに追加される既定の引数を指定します。

変更前

dockerfile
CMD [-b]
ENTRYPOINT [top]

変更後

dockerfile
CMD ["-b"]
ENTRYPOINT ["top"]

説明:

  • 変更前: 文字列を引用符で囲んでいない配列は有効なJSONではなく、意図したexec形式になりません。
  • 変更後: JSON配列でtop -bを直接実行します。実際のアプリケーションでも、シグナル処理と正常な終了をテストしてください。

参考資料