Cron 不在 PHP Docker 容器中 运行
Cron does not run in a PHP Docker container
我正在使用 php:7.4-fpm
Docker 图像,我正在尝试将 cron 设置为 运行 但它不是 运行ning。
这是我的Docker文件:
FROM php:7.4-fpm
# Set working directory
WORKDIR /var/www
# Install dependencies
RUN apt-get update && apt-get install -y \
cron \
build-essential \
libpng-dev \
libjpeg62-turbo-dev \
libfreetype6-dev \
locales \
libzip-dev \
libmcrypt-dev \
libonig-dev \
zlib1g-dev \
zip \
jpegoptim optipng pngquant gifsicle \
vim \
unzip \
git \
graphviz \
curl \
supervisor
# Install Imagick
RUN apt-get update && \
apt-get install -y libmagickwand-dev --no-install-recommends && \
pecl install imagick && \
docker-php-ext-enable imagick
# Clear cache
RUN apt-get clean && rm -rf /var/lib/apt/lists/*
# Install extensions
RUN docker-php-ext-install pdo_mysql zip exif pcntl
# Permissions for Laravel
RUN chown -R www-data:www-data /var/www
RUN chmod -R 777 /var/www
# Copy crontab file to the cron.d directory
COPY ./docker/php-server/crontab /etc/cron.d/crontab
# Give execution rights on the cron job
RUN chmod 0644 /etc/cron.d/crontab
# Apply cron job
RUN crontab /etc/cron.d/crontab
# Create the log file to be able to run tail
RUN touch /var/log/cron.log
EXPOSE 9000
CMD bash -c "cron && php-fpm"
当我进入容器并检查/etc/cron.d/crontab
的内容时,它是正确的
* * * * * php /var/www/artisan schedule:run >> /var/log/cron.log 2>&1
# An empty line
但它不是运行。我不确定这里发生了什么..
当我 运行 service cron status
它说 [ ok ] cron is running.
但什么也没有发生。
我有同样的错误,通过在托管 docker 容器而不是容器本身的机器上设置 cron 来修复。
所以 cron 条目转换为类似这样的内容:
* * * * * docker exec web php artisan schedule:run >> storage/logs/cron.log 2>&1
如果您遇到 tty 分配问题,请尝试 docker exec -it
所以我终于设法解决了。我不知道为什么复制 cron 文件不起作用。我仍然不知道为什么。 (也许比我聪明的人可以解释一下)。但是我通过将我的命令附加到 /etc/crontab
文件非常简单地解决了它,现在它可以工作了。
P.S。 crontab 文件末尾需要换行符,因此使用 echo
会自动添加它。
这是我更新的 Dockerfile(我删除了复制 crontab 的所有其他行):
RUN echo "* * * * * root php /var/www/artisan schedule:run >> /var/log/cron.log 2>&1" >> /etc/crontab
# Create the log file to be able to run tail
RUN touch /var/log/cron.log
我正在使用 php:7.4-fpm
Docker 图像,我正在尝试将 cron 设置为 运行 但它不是 运行ning。
这是我的Docker文件:
FROM php:7.4-fpm
# Set working directory
WORKDIR /var/www
# Install dependencies
RUN apt-get update && apt-get install -y \
cron \
build-essential \
libpng-dev \
libjpeg62-turbo-dev \
libfreetype6-dev \
locales \
libzip-dev \
libmcrypt-dev \
libonig-dev \
zlib1g-dev \
zip \
jpegoptim optipng pngquant gifsicle \
vim \
unzip \
git \
graphviz \
curl \
supervisor
# Install Imagick
RUN apt-get update && \
apt-get install -y libmagickwand-dev --no-install-recommends && \
pecl install imagick && \
docker-php-ext-enable imagick
# Clear cache
RUN apt-get clean && rm -rf /var/lib/apt/lists/*
# Install extensions
RUN docker-php-ext-install pdo_mysql zip exif pcntl
# Permissions for Laravel
RUN chown -R www-data:www-data /var/www
RUN chmod -R 777 /var/www
# Copy crontab file to the cron.d directory
COPY ./docker/php-server/crontab /etc/cron.d/crontab
# Give execution rights on the cron job
RUN chmod 0644 /etc/cron.d/crontab
# Apply cron job
RUN crontab /etc/cron.d/crontab
# Create the log file to be able to run tail
RUN touch /var/log/cron.log
EXPOSE 9000
CMD bash -c "cron && php-fpm"
当我进入容器并检查/etc/cron.d/crontab
的内容时,它是正确的
* * * * * php /var/www/artisan schedule:run >> /var/log/cron.log 2>&1
# An empty line
但它不是运行。我不确定这里发生了什么..
当我 运行 service cron status
它说 [ ok ] cron is running.
但什么也没有发生。
我有同样的错误,通过在托管 docker 容器而不是容器本身的机器上设置 cron 来修复。
所以 cron 条目转换为类似这样的内容:
* * * * * docker exec web php artisan schedule:run >> storage/logs/cron.log 2>&1
如果您遇到 tty 分配问题,请尝试 docker exec -it
所以我终于设法解决了。我不知道为什么复制 cron 文件不起作用。我仍然不知道为什么。 (也许比我聪明的人可以解释一下)。但是我通过将我的命令附加到 /etc/crontab
文件非常简单地解决了它,现在它可以工作了。
P.S。 crontab 文件末尾需要换行符,因此使用 echo
会自动添加它。
这是我更新的 Dockerfile(我删除了复制 crontab 的所有其他行):
RUN echo "* * * * * root php /var/www/artisan schedule:run >> /var/log/cron.log 2>&1" >> /etc/crontab
# Create the log file to be able to run tail
RUN touch /var/log/cron.log