我在 GKE 上部署了一个 Laravel 9 应用程序。它有一些后台作业,我已将其配置为使用主管运行(我将在下面分享配置文件的片段)。
问题
问题是当使用调度程序或手动使用 artisan 命令运行作业时,storage/framework/cache/data
中创建了缓存文件。路径为 root
用户作为所有者。这会导致问题,因为错误不断记录并显示消息 Unable to create lockable file
因为所有其他文件夹和文件都有用户 www-data
我们将其设置为 Dockerfile
。要修复它,我必须手动运行 chown -R www-data:www-data .
在上面的缓存路径中。
Dockerfile
FROM php:8.0-fpm
# Copy composer.lock and composer.json
COPY composer.lock composer.json /var/www/
# Set working directory
WORKDIR /var/www
# Install dependencies
RUN apt-get update && apt-get install -y \
build-essential \
libpng-dev \
libonig-dev \
libicu-dev \
libjpeg62-turbo-dev \
libfreetype6-dev \
locales \
libzip-dev \
libpq-dev \
ca-certificates \
zip \
jpegoptim optipng pngquant gifsicle \
nano \
unzip \
git \
curl \
supervisor \
cron \
nginx
# Clear cache
RUN apt-get clean && rm -rf /var/lib/apt/lists/*
# Install extensions
RUN docker-php-ext-install pdo pdo_mysql mbstring zip exif bcmath
RUN docker-php-ext-configure gd --with-freetype --with-jpeg
RUN docker-php-ext-install gd
RUN docker-php-ext-configure intl
RUN docker-php-ext-install intl
# Install composer
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
COPY scripts/supervisor.conf /etc/supervisor/conf.d/supervisor.conf
COPY /scripts/nginx/nginx.conf /etc/nginx/sites-enabled/default
# Create the log file to be able to run tail
RUN touch /var/log/cron.log
# Setup cron job
COPY scripts/crontab /etc/cron.d/scheduler
RUN chmod 0644 /etc/cron.d/scheduler
RUN usermod -u 1000 www-data
RUN usermod -G staff www-data
COPY --chown=www-data:www-data . /var/www
RUN touch /var/www/storage/logs/laravel.log
RUN mkdir /var/www/storage/framework/cache/data
RUN chown -R www-data:www-data /var/www/storage
RUN chmod -R 777 /var/www/storage
RUN composer install --no-interaction
COPY /scripts/entrypoint.sh /etc/entrypoint.sh
RUN chmod +x /etc/entrypoint.sh
EXPOSE 80 443
ENTRYPOINT ["/etc/entrypoint.sh"]
定时任务
* * * * * root echo "cron working..." >> /var/log/cron.log
* * * * * root /usr/local/bin/php /var/www/artisan schedule:run >> /var/log/cron.log
入口点.sh
#!/usr/bin/env bash
php artisan config:cache
service supervisor start
service nginx start
php-fpm
supervisor.conf
[program:cron]
process_name=%(program_name)s_%(process_num)02d
command=cron -f
autostart=true
autorestart=true
startretries=5
numprocs=1
stderr_logfile=/var/log/cron.log
stderr_logfile_maxbytes=10MB
stdout_logfile=/var/log/cron.log
stdout_logfile_maxbytes=10MB
到目前为止我尝试过的事情
我尝试将 crontab 中的用户组从 root 更改为 www-data,但这导致 cron 根本无法工作。
我尝试过更换主管user
到 www-data,因此 cron 命令由 www-data 而不是 root 运行。
还在 Dockerfile 中将用户设置为 www-data,但所有解决方案要么导致 cron 根本不运行,要么作业创建的文件仍归 root
所有。用户。
最佳答案
经过大量调查,我发现以 root
用户身份运行 Laravel Scheduler 并不是一个好的做法,因为这会创建具有 root 所有者的文件。
我将我的 crontab
文件更新为以下内容:
* * * * * root su -c "/usr/local/bin/php /var/www/artisan schedule:run >> /var/log/cron.log" -s /bin/bash www-data
这样,创建的缓存文件将归 www-data
所有,并且不会创建来自根所有者的文件。
希望这对面临同样问题的人有所帮助。
关于php - Laravel Scheduler 以 root 用户身份创建缓存文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73826886/