実現したいこと
Dockerコンテナ内でcronを入れてコンテナを常時立ち上げ、PHP/Laravelで作成されたジョブを定期実行したいのですが、No scheduled commands are ready to run.となってしまいます。
また、手動実行では問題なく実行できております。
以下確認した内容です。laravel.logや/var/log/cron.logには何も出力がありませんでした。
which phpの結果:/usr/local/bin/php
ps aux | grep cron:稼働していることを確認
php.iniにdisable_functions = proc_openの記載はなし
発生している問題・分からないこと
php artisan schedule:runした結果は以下です。
INFO No scheduled commands are ready to run.
エラーメッセージ
error
1laravel.logやcron.logには何も出力されていません。
該当のソースコード
dockercompose.yml
1version: '3.9' 2 3services: 4 backend: 5 build: 6 context: ./backend 7 container_name: backend-container 8 volumes: 9 - ../src:/var/www/html 10 ports: 11 - "80:80" 12 depends_on: 13 - db 14 15 frontend: 16 build: 17 context: ./frontend 18 container_name: frontend-container 19 working_dir: /var/www/html 20 ports: 21 - "5173:5173" 22 volumes: 23 - ../src:/var/www/html 24 25 batch: 26 build: 27 context: ./batch 28 container_name: batch-container 29 volumes: 30 - ../src:/var/www/html 31 depends_on: 32 - db 33 34 db: 35 image: mysql:latest 36 container_name: db-container 37 ports: 38 - "3306:3306" 39 environment: 40 MYSQL_ROOT_PASSWORD: root 41 MYSQL_DATABASE: laravel 42 MYSQL_USER: laravel 43 MYSQL_PASSWORD: laravel 44 volumes: 45 - db_data:/var/lib/mysql 46 - ./mysql/my.cnf:/etc/mysql/my.cnf 47 48volumes: 49 db_data:
Dockerfile
1FROM php:8.4-cli 2 3RUN apt-get update && apt-get install -y \ 4 cron \ 5 rsyslog \ 6 curl \ 7 zip \ 8 unzip \ 9 git \ 10 libpng-dev \ 11 libonig-dev \ 12 libxml2-dev \ 13 libzip-dev \ 14 nano \ 15 vim \ 16 procps \ 17 && docker-php-ext-install pdo_mysql mbstring exif pcntl bcmath gd zip 18 19COPY --from=composer:latest /usr/bin/composer /usr/bin/composer 20 21# php.iniをコンテナ内にコピー 22COPY php.ini /usr/local/etc/php/ 23 24# cron ジョブの設定をコピー 25COPY crontab /etc/cron.d/batch-cron 26 27# 設定ファイルの権限を変更 28RUN chmod 0644 /etc/cron.d/batch-cron && \ 29 crontab /etc/cron.d/batch-cron 30 31WORKDIR /var/www/html 32 33# cronのログ出力先を設定(/var/log/cron.log) 34RUN echo "cron.* /var/log/cron.log" > /etc/rsyslog.d/cron-log.conf 35 36# ログファイルがない場合に作成し、適切な権限を設定 37RUN touch /var/log/cron.log && chmod 666 /var/log/cron.log 38 39# cronとrsyslogをバックグラウンドで実行する 40CMD cron && tail -f /var/log/cron.log
SampleJob.php
1<?php 2 3namespace App\Console\Commands; 4 5use Illuminate\Console\Command; 6 7class SampleJob extends Command 8{ 9 /** 10 * The name and signature of the console command. 11 * 12 * @var string 13 */ 14 protected $signature = 'batch:sample'; 15 16 /** 17 * The console command description. 18 * 19 * @var string 20 */ 21 protected $description = 'Command description'; 22 23 /** 24 * Execute the console command. 25 */ 26 public function handle() 27 { 28 \Log::info('Batch job is run!!!'); 29 } 30} 31
Kernel.php
1<?php 2 3namespace App\Console; 4 5use App\Console\Commands\SampleJob; 6use Illuminate\Console\Scheduling\Schedule; 7use Illuminate\Foundation\Console\Kernel as ConsoleKernel; 8 9class Kernel extends ConsoleKernel 10{ 11 /** 12 * Define the application's command schedule. 13 * 14 * @param \Illuminate\Console\Scheduling\Schedule $schedule 15 * @return void 16 */ 17 protected function schedule(Schedule $schedule) 18 { 19 $schedule->command('batch:sample')->everyMinute(); 20 } 21 22 /** 23 * Register the commands for the application. 24 * 25 * @return void 26 */ 27 protected function commands() 28 { 29 $this->load(__DIR__.'/Commands'); 30 31 require base_path('routes/console.php'); 32 } 33} 34
crontab
1* * * * * root cd /var/www/html && php artisan schedule:run >> /var/log/cron.log 2>&1
試したこと・調べたこと
- teratailやGoogle等で検索した
- ソースコードを自分なりに変更した
- 知人に聞いた
- その他
上記の詳細・結果
- crontabを以下に修正
crontab
1* * * * * root cd /var/www/html && /usr/local/bin/php artisan schedule:run >> /var/log/cron.log 2>&1
または
crontab
1* * * * * root cd /var/www/html && source /etc/profile && php artisan schedule:run >> /var/log/cron.log 2>&1
上記結果は変わらず、ログ出力もなし
2.権限を変更
chmod 644 /var/log/cron.log及びchmod 777 /var/log/cron.log
上記結果は変わらず、ログ出力もなし
3.cron restartやコンテナ再ビルド
上記結果は変わらず、ログ出力もなし
4.各種php artisan のキャッシュクリア
上記結果は変わらず
補足
PHP:8.4
Laravel:12.1
Docker:28.0.0
Docker Compose:v2.33.0

回答1件
あなたの回答
tips
プレビュー