- 追加された行はこの色です。
- 削除された行はこの色です。
#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