php - Laravel Scheduler 以 root 用户身份创建缓存文件

标签 php laravel docker cron

我在 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/

相关文章:

c# - 使用 docker 将 microsoft bot 框架部署到 heroku 时出现问题

javascript - 如何应用“加载更多”以在 WordPress 模板中获取自定义帖子

php - Magento 只在一个网站上搜索速度慢

javascript - 缺少 jquery,即使它位于文件 laravel 中

php - laravel file_get_contents ('php://input')不工作

node.js - 代理套接字 io 无法与 docker 上的 nginx、node 连接

php - 将文件添加到存档后删除文件会阻止创建存档

php - 在 php/mysqli 中使用存储过程检索多个结果集

php - Laravel Eloquent 获取所有行及其各自的数据透视表行

docker - docker compose:使用网桥时不分配主机名