はじめに
Dockerコンテナ内でcronを利用してバッチ処理を行うための設定を備忘録として残します。
開発環境構築時にわざわざコンテナに入ってcrontabを修正するような手順を省くための手順です。
環境
version | |
---|---|
PHP | 8.0.10 |
Laravel Framework | 8.83.23 |
Docker Compose | 2.10.2 |
前提
Laravelがインストールされているコンテナ内でcronが実行されていること。
Laravelのcommandを登録済みであること(php artisan make:command
)。
手順
定期的に実行させたい処理を登録
app/Console/Kernel.php
class Kernel extends ConsoleKernel
{
/**
* The Artisan commands provided by your application.
*
* @var array
*/
protected $commands = [
Hogehoge::class, // 実行させたいクラス
];
/**
* Define the application's command schedule.
*
* @param \Illuminate\Console\Scheduling\Schedule $schedule
* @return void
*/
protected function schedule(Schedule $schedule)
{
$schedule->command('example:test') // 毎分 example:test を実行する
->everyMinute();
}
一度Dockerコンテナに入り、cronの設定を確認・コピーする
crontab -l
ついでにcron設定の保存先を確認(おそらく /var/spool/cron/crontabs/
配下)。
cronの設定を記述したファイルを作成, Dockerビルド時にコピーするコマンドを追記
# min hour day month weekday command
*/15 * * * * run-parts /etc/periodic/15min
0 * * * * run-parts /etc/periodic/hourly
0 2 * * * run-parts /etc/periodic/daily
0 3 * * 6 run-parts /etc/periodic/weekly
0 5 1 * * run-parts /etc/periodic/monthly
# 以下追記
* * * * * cd /data/www/laravel-project/ && /usr/local/bin/php artisan schedule:run
# rootユーザーのcron設定としてコピー
COPY ./docker/php/crontab /var/spool/cron/crontabs/root
最後に
docker compose build
してcron
の設定がコンテナに反映されており、Laravelのジョブが実行されているかを確認。
参考