説明
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を直接実行します。実際のアプリケーションでも、シグナル処理と正常な終了をテストしてください。