• 追加された行はこの色です。
  • 削除された行はこの色です。
#author("2021-02-25T07:49:29+09:00","default:ryuichi","ryuichi")
#author("2021-02-25T08:20:49+09:00","default:ryuichi","ryuichi")
* CMDで指定する配列と文字列の違い [#kf813bfe]

** Execフォームとシェルフォーム [#eec8dad3]


*** Execフォーム [#zc6e70ae]

 CMD ["echo", "Hello World"]

*** シェルフォーム [#nf92b8fc]

 CMD  "echo Hello World"

- Execフォームはシェルを介在せずに直接実行される
- シェルフォームはBashなどシェルを介して実行される

** Execフォームが問題になるケース [#a7db6ce4]

- 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フォームでこの問題を解決するには [#w8ce27ff]

 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フォームとシェルフォームどちらがいいのか? [#d3a98e42]

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

** 参考 [#w836fa83]

- https://nickjanetakis.com/blog/docker-tip-63-difference-between-an-array-and-string-based-cmd
- https://stackoverflow.com/questions/40454470/how-can-i-use-a-variable-inside-a-dockerfile-cmd


トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS