【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の場合、引数に指定した処理が実行される

你可以放心地进行魔改进了!

bannerAds