LoginSignup
8
6

More than 1 year has passed since last update.

【Docker】コンテナ内でcron実行させる

Posted at

はじめに

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のジョブが実行されているかを確認。

参考

8
6
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
8
6