お問い合わせ

ブログ

これまでに経験してきたプロジェクトで気になる技術の情報を紹介していきます。

Docker だけで supervisor を使わずにお手軽に Laravel queue worker を監視するたった一つの冴えた方法

NMC NMC 3 years
Docker だけで supervisor を使わずにお手軽に Laravel queue worker を監視するたった一つの冴えた方法

Laravel で queue を使う場合は、
worker プロセスがエラーで落ちっぱなしにならないように、
supervisor を使えと公式ドキュメントにも書かれています。

https://laravel.com/docs/8.x/queues#installing-supervisor

ですが docker を使っているなら、もっと簡単な方法があります!

Container

まず、worker process を動かすための containerを別に用意しましょう。

docker-compose.yml

  # laravel queue worker 用の container
  container_worker:
    build: ./docker/php    # container_php と同じ Dockerfile を使用する。
    working_dir: /var/www
    entrypoint: ["php", "artisan", "queue:listen"]
    restart: unless-stopped

  # http access を処理する container
  container_php:
    build: ./docker/php

image は http access を処理する php と同じにします。
image が同じなら無駄に容量は喰いません!

Entrypoint

entrypoint は、記述されたコマンドをコンテナ起動時に実行してくれます。
そして、その process が停止すると container も停止されます。

    working_dir: /var/www
    entrypoint: ["php", "artisan", "queue:listen"]

こう記述した場合は、
OS 起動後、

$ cd /var/www
$ php artisan queue:listen

としたのと同じになります。

Supervising

queue worker が落ちたら container が落ちますので、
container を自動で再起動するように設定しましょう。

    restart: unless-stopped

これで手動で停止する以外の方法で container が停止したら、自動的に再起動してくれます。

本当は Docker の公式ドキュメント にあるように

    restart: on-failure[:max-retries]

と、リトライ回数を指定したいところですが、
laravel queue worker は不正終了でも exit 0 で終了するようです。
そのため、正常終了と判断されて再起動してくれません。

Docker だけで supervisor を使わずにお手軽に Laravel queue worker を監視するたった一つの冴えた方法 2021-09-14 20:58:05

test

  • 3 years
4073

お気軽に
お問い合わせください。

お問い合わせ
gomibako@aska-ltd.jp