16
13

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【Docker / php-fpm】docker-php-entrypointの動作

Last updated at Posted at 2019-12-06

php公式イメージのDockefileの内容を確認していたら

Dockerfile
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をそのまま実行

解説

下記が問題のファイルです。単純なシェルですね。

docker-php-entrypoint
#!/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の場合、引数に指定した処理が実行される

これで安心して魔改造できますね!

16
13
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
16
13

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?