【Docker / php-fpm】docker-php-entrypoint的运行
当我在检查php公式镜像的Dockerfile内容时。
ENTRYPOINT:["docker-php-entrypoint"]
(中略)
CMD:["php-fpm"]
看到这段描述之后,我想弄清楚这是什么,于是看了解释。
这可能有助于在php官方镜像中添加运行选项,或者在运行php和其他进程的同时提供一些帮助。
如果同时存在ENTRYPOINT和CMD
如果同时设置了ENTRYPOINT和CMD,CMD的值将作为ENTRYPOINT的参数被传递。
这个案例
在这种情况下,CMD中设置的php-fpm会单独启动进程,但却会被传递给ENTRYPOINT的docker-php-entrypoint作为参数。
在我的情况下,我尝试通过在CMD中指定shell来在同一个容器中运行php和cron。如果我不理解docker-php-entrypoint的作用,可能会导致意想不到的行为,有点让人担心。
提前得出结论
如果有人在思考着类似的事情,那么没有问题,就照原样继续吧。
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 “$@”)
这是一种情况。
判断是否是选项,是根据第一个参数中”-“后面的部分以及整个第一个参数是否与选项匹配(以”-“开头或非选项)来进行判断。
我认为制作一个将 exec 改为 echo 的 shell 并尝试运行会更加清楚易懂。以下是这种情况的示例。
只传递选项并执行(随便)
$ docker-php-entrypoint-echo -f -d
php-fpm -f -d
// php-fpmにシェル実行時の引数が続く
// execの場合、オプション付きのphp-fpmが実行される
其他
$ docker-php-entrypoint-echo test.sh
test.sh
// 渡した引数だけが表示される
// execの場合、引数に指定した処理が実行される
你可以放心地进行魔改进了!