Docker部署PHP8.1+Laravel9时Supervisor权限错误解决求助
解决Docker容器中Supervisor启动的PermissionError问题
在PHP8.1+Laravel9的Docker容器中安装Supervisor时,遇到以下权限错误:
PermissionError: [Errno 13] Permission denied: '/var/log/supervisor/supervisord.log'
现有配置文件
supervisor.conf
[program:laravel-worker] process_name=%(program_name)s_%(process_num)02d command=php /var/www/html/artisan queue:work autostart=true autorestart=true stopasgroup=true killasgroup=true numprocs=1 redirect_stderr=true stdout_logfile=/var/www/html/storage/logs/worker.log stopwaitsecs=3600 stdout_logfile_maxbytes=5MB
PHP Dockerfile
FROM php:8.1.13-fpm RUN apt-get update && apt-get install -y \ libfreetype6-dev \ libjpeg62-turbo-dev \ libpng-dev \ nano \ libxslt1.1 \ libxslt1-dev \ unzip \ git \ gnupg \ libpq-dev \ libzip-dev \ iputils-ping \ supervisor \ && docker-php-ext-install zip \ gd \ mysqli pdo pdo_mysql \ && docker-php-ext-enable pdo_mysql \ && docker-php-ext-configure gd --with-freetype --with-jpeg \ && docker-php-ext-configure intl RUN echo "memory_limit='512M'" >> /usr/local/etc/php/conf.d/php-extra.ini; ENV PHP_IDE_CONFIG "serverName=new_app" RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/bin --filename=composer --version=2.3.8 && chmod +x /usr/bin/composer # Set timezone RUN rm /etc/localtime \ && ln -s /usr/share/zoneinfo/Europe/Warsaw /etc/localtime \ && "date" \ && printf '[PHP]\ndate.timezone = "Europe/Warsaw"\n' > /usr/local/etc/php/conf.d/tzone.ini RUN usermod -aG docker $USER COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf CMD ["/usr/bin/supervisord", "-c", "/etc/supervisor/supervisord.conf"] WORKDIR /var/www/html
解决步骤
错误原因是Supervisor默认日志目录/var/log/supervisor/的权限不足,容器运行用户无写入权限,可通过以下方式解决:
方法1:创建日志目录并设置权限
在Dockerfile中添加命令,创建Supervisor日志目录并将权限赋予php-fpm默认运行用户www-data:
# 创建Supervisor日志目录并设置权限 RUN mkdir -p /var/log/supervisor && chown -R www-data:www-data /var/log/supervisor
方法2:修改Supervisor主配置,指定可写日志路径
自定义Supervisor主配置,将日志路径改为Laravel的storage目录(该目录通常已配置好www-data权限):
- 在Dockerfile中复制自定义主配置:
# 复制自定义Supervisor主配置 COPY supervisord-main.conf /etc/supervisor/supervisord.conf # 复制Laravel Worker配置 COPY supervisord.conf /etc/supervisor/conf.d/laravel-worker.conf
- 创建
supervisord-main.conf文件,修改日志路径及运行用户:
[unix_http_server] file=/var/run/supervisor.sock chmod=0700 [supervisord] logfile=/var/www/html/storage/logs/supervisord.log logfile_maxbytes=50MB logfile_backups=10 loglevel=info pidfile=/var/run/supervisord.pid nodaemon=false minfds=1024 minprocs=200 user=www-data [rpcinterface:supervisor] supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface [supervisorctl] serverurl=unix:///var/run/supervisor.sock [include] files = /etc/supervisor/conf.d/*.conf
方法3:以root用户运行Supervisor(不推荐)
若临时测试,可在Dockerfile中切换到root用户启动Supervisor,但生产环境不建议使用:
USER root CMD ["/usr/bin/supervisord", "-c", "/etc/supervisor/supervisord.conf"]
内容的提问来源于stack exchange,提问作者Klick
相关产品推荐
相关产品推荐

