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