php公式イメージのDockefileの内容を確認していたら
ENTRYPOINT:["docker-php-entrypoint"]
(中略)
CMD:["php-fpm"]
という記述を見つけてなんぞこれ?となったのでその解説。
php公式イメージでphp起動にオプション付与したり、
phpと別プロセスも走らせたりするときの一助にはなるかと。
ENTRYPOINTとCMDが両方ある場合
ENTRYPOINTとCMDがどちらもセットしてある場合、
CMDの設定値はENTRYPOINTへの引数として渡されます。
今回のケース
今回の場合、CMDに設定されているphp-fpmはそれ単体でプロセス起動されるのに、わざわざENTRYPOINTのdocker-php-entrypointに引数として渡されることになります。
僕の場合、CMDにシェルを指定してphpとcronを同一コンテナで動かそうとしていました。
docker-php-entrypointが何をしているか理解しないと想定外の動きをしそうでちょっと怖いですね。
先に結論
似た様なことを考えている人、問題ないのでそのままGOしてください。
docker-php-entrypoint、以下の単純な処理のためのものです。
CMDにオプションだけがセット → CMDの設定値をオプションとしてphp-fpmを起動
その他 → CMDをそのまま実行
解説
下記が問題のファイルです。単純なシェルですね。
#!/bin/sh
set -e
# first arg is `-f` or `--some-option`
if [ "${1#-}" != "$1" ]; then
set -- php-fpm "$@"
fi
exec "$@"
ざっと解説すると
- 実行時に渡された1番目の引数がオプションかどうかチェック (if文)
- オプションだったら1番目の引数に"php-fpm"、実行時の引数をそれ以降の引数としてセット (set -- php-fpm "$@")
- 全引数を並べて実行 (exec "$@")
って流れです。
オプションかどうかは1番目の引数の"-"以降を抜き出したものと、
1番目の引数全体が合致(-で始まるオプションか否か)で判定しています。
execをechoに変えたシェルを作って試してみるとわかりやすいと思います。
以下、その場合の例です。
オプションだけを渡して実行(適当)
$ docker-php-entrypoint-echo -f -d
php-fpm -f -d
// php-fpmにシェル実行時の引数が続く
// execの場合、オプション付きのphp-fpmが実行される
その他
$ docker-php-entrypoint-echo test.sh
test.sh
// 渡した引数だけが表示される
// execの場合、引数に指定した処理が実行される
これで安心して魔改造できますね!