Laravel Sail / Docker 環境で Cron を実行する方法

2024/02/18に公開

手順

1. Laravel Sail の Docker 設定をカスタマイズできるようにする

masa:SailProject % sail artisan sail:publish
   INFO  Publishing [sail-docker] assets.  
  Copying directory [vendor/laravel/sail/runtimes] to [docker] ..... DONE
   INFO  Publishing [sail-database] assets.  
  Copying directory [vendor/laravel/sail/database] to [docker] ..... DONE

-> プロジェクトディレクトリ > docker が作成される

2. 使用している PHP のバージョンを確認する

masa:SailProject % php --version
PHP 8.3.2 (cli) (built: Jan 16 2024 13:46:41) (NTS)
Copyright (c) The PHP Group
Zend Engine v4.3.2, Copyright (c) Zend Technologies
    with Zend OPcache v8.3.2, Copyright (c), by Zend Technologies
masa:NicodbApp (main *%=)% 

-> 使用している PHP のバージョンは 8.3

3. supervisord.conf に Cron の設定を追記する

プロジェクトディレクトリ > docker > 手順2で確認したPHPのバージョン > supervisord.conf

Cron の設定を追記する

docker/8.3/supervisord.conf
[supervisord]
nodaemon=true
user=root
logfile=/var/log/supervisor/supervisord.log
pidfile=/var/run/supervisord.pid

[program:php]
command=%(ENV_SUPERVISOR_PHP_COMMAND)s
user=sail
environment=LARAVEL_SAIL="1"
stdout_logfile=/dev/stdout
stdout_logfile_maxbytes=0
stderr_logfile=/dev/stderr
stderr_logfile_maxbytes=0

[program:cron]
command=/usr/sbin/cron -f -l 8
autostart=true
stdout_logfile=/var/log/cron.out.log
stderr_logfile=/var/log/cron.err.log

3. Cron スケジューラーを作成する

supervisord.conf と同じディレクトリに scheduler というファイルを作成し、cron スケジュールを記載する(下記は毎分実行の例)。

docker/8.3/scheduler
* * * * * root cd /var/www/html && php artisan schedule:run >> /dev/null 2>&1

4. Dockerfile を編集する

プロジェクトディレクトリ > docker > 手順2で確認したPHPのバージョン > Dockerfile

インストールセクションに cron をインストールするための以下のセクションを追加する。

docker/8.3/Dockerfile
RUN apt-get update \
    && apt-get install -y cron \

次に、他の設定ファイルをコンテナにコピーするセクションの前に、以下のブロックを追加する。

docker/8.3/Dockerfile
COPY scheduler /etc/cron.d/scheduler
RUN chmod 0644 /etc/cron.d/scheduler \
    && crontab /etc/cron.d/scheduler

5. Docker Sail イメージを再構築する

# Docker Sail イメージを再構築
sail build --no-cache

# Sail 起動
sail up -d

参考

Laracasts - does-laravel-sail-setup-cron-for-schelations
Running Scheduled Jobs in Laravel Sail Using Supervisord

Discussion