CMDで指定する配列と文字列の違い

Execフォームとシェルフォーム

Execフォーム

 CMD ["echo", "Hello World"]

シェルフォーム

 CMD  "echo Hello World"
  • Execフォームはシェルを介在せずに直接実行される
  • シェルフォームはBashなどシェルを介して実行される

Execフォームが問題になるケース

  • Execフォームで指定すると、シェルの機能、変数の展開やパイプ、ワイルドカード指定などが使えなくなる
  • 例えば環境変数$PATHを表示しようとすると、
 vi Dockerfile
 -----------------------
 FROM ubuntu
 CMD [ "echo", "$PATH" ]
 -----------------------
 docker build -t test .
 docker run test
   => $PATH
  • Exceフォームでは$PATHが展開されずに、文字通りに$PATHとechoされる
  • これを展開させるには、
 vi Dockerfile
 -----------------------
 FROM ubuntu
 CMD echo $PATH
 -----------------------
 docker build -t test .
 docker run test
   => /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
  • シェルフォームにする。シェルが$PATHを展開してくれる

Execフォームでこの問題を解決するには

 vi Dockerfile
 -----------------------
 FROM ubuntu
 CMD [ "sh", "-c", "echo $PATH" ]
 -----------------------
 docker build -t test .
 docker run test
   => /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
  • CMDの中でshを-cオプションで起動して、その中で任意のコマンドを実行する

Execフォームとシェルフォームどちらがいいのか?

  • Docker公式ではExecフォームが推奨されている
  • が、特別大きなメリットはないように思う
  • 環境変数を参照したいなど、シェルの機能が使いたい時は素直にシェルフォームを使った方がいい
  • https://docs.docker.com/engine/reference/builder/#cmd

参考


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS

Last-modified: 2021-02-25 (木) 08:20:49