Задать вопрос
@gloopsee

Как заставить cron работать внутри docker контейнера?

Есть приложение на laravel, развернутое на docker compose. Реализован простой планировщик задач на laravel.

Schedule::call(function () {
    Log::info('Hello World!');
})->everyTwoSeconds();


С помощью докер файла добавляю задачу в крон при каждом запуске контейнера.

FROM php:8.2-fpm

RUN apt-get update && apt-get install -y cron

RUN echo "* * * * * php artisan schedule:run >> /dev/null 2>&1" > /etc/cron.d/my_cron_jobs

RUN chmod 0644 /etc/cron.d/my_cron_jobs

RUN crontab /etc/cron.d/my_cron_jobs

WORKDIR /var/www/laravel

RUN docker-php-ext-install pdo pdo_mysql


Если я вручную захожу в контейнер и в папке с проектом прописываю php artisan schedule:run, то планировщик работает и логи отправляются. А автоматически cron это выполнять не хочет. В чем может быть проблема?

Вот еще код docker-compose:
version: "3.8"

services:
  nginx:
    image: "nginx:stable-alpine"
    ports:
      - "8000:80"
    volumes:
      - ./nginx.conf:/etc/nginx/conf.d/default.conf:ro
      - ./:/var/www/laravel
  php:
    build:
      dockerfile: Dockerfile
    volumes:
      - ./:/var/www/laravel

  mysql:
    build:
      dockerfile: mysql.Dockerfile
    container_name: mysql_db
    restart: always
    env_file:
      - mysql.env
    ports:
      - "3306:5891"
    volumes:
      - db_data:/var/lib/mysql

volumes:
   db_data:
   cron_data:
  • Вопрос задан
  • 182 просмотра
Подписаться 2 Средний 3 комментария
Решения вопроса 1
smilingcheater
@smilingcheater
Вы некорректно задаёте команду для крона. Надо задавать полные пути для всех файлов
* * * * * /usr/bin/php /var/www/laravel/artisan schedule:run


В dev/null также пусто.

Спасибо, посмеялся. Вы понимаете что такое /dev/null?
Если вам нужны системные логи запуска команды - так и перенаправьте их в конкретный файл...
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы