問題
以下のようなDockerfileで起動しているような開発用のLaravelコンテナが、 restartや再build後のup等で必ず10秒かかる。
Dockerfile
FROM php8.2-fpm-alpine
...
CMD ["php", "artisan", "serve", "--host", "0.0.0.0"]
原因
Docker Composeのよくある質問と回答 - サービスの再作成や停止に10秒かかるのはどうして?に原因は記載されています。
しかし、ここに書いてあるように ["php", ...]
形式で書いても、私の場合解決しませんでした。
根本的な問題としてはdocker composeのstopのシグナルが SIGTERM
であり、 php artisan serve
は SIGINT
を期待していることにあります。
解決策
簡単なラッパスクリプトを用意してSIGTERMをSIGINTに変換することで即座に停止できるようになりました。
(1 2 3 15は拾うシグナルでもうちょいちゃんと狭められます...)
artisan-serve-wrapper.sh
php artisan serve --host 0.0.0.0 &
pid=$!
trap "kill -SIGINT $pid" 1 2 3 15
wait $pid
FROM php8.2-fpm-alpine
...
CMD ["./artisan-serve-wrapper.sh"]