Laravel+Docker环境下laravel.log权限拒绝问题求助
这个权限问题在Docker部署Laravel时太常见了,核心原因是容器内PHP-FPM进程的运行用户和你本地挂载目录的用户ID不匹配——你之前执行sudo chown lykos:lykos -R ./src只修改了本地目录的属主,但容器里的PHP进程根本不是用lykos用户运行的,所以没用。
下面给你几个靠谱的解决方案:
方案一:直接匹配容器内用户的UID修改本地权限
先确认容器内PHP-FPM的运行用户UID:
执行命令进入app容器查看:docker-compose exec app id www-data通常默认的
www-data用户UID是33,如果输出是uid=33(www-data) gid=33(www-data)...,就用这个UID继续下一步。修改本地
src目录的属主为这个UID:sudo chown -R 33:33 ./src修改完后重启容器:
docker-compose restart app nginx这样容器里的
www-data进程就能正常读写挂载的目录了。
方案二:在Dockerfile中调整容器内用户UID匹配本地用户
这个方法更灵活,适合长期开发环境:
先查看你本地
lykos用户的UID:id -u lykos大部分Linux系统普通用户UID都是
1000,假设你的输出也是这个数值。编辑
docker/Dockerfile,添加以下内容(放在PHP-FPM配置相关步骤之后即可):# 调整www-data用户的UID和GID匹配本地用户 RUN usermod -u 1000 www-data && groupmod -g 1000 www-data重新构建app镜像并重启容器:
docker-compose build app docker-compose up -d这样容器内的
www-data用户和你本地lykos用户的UID完全一致,挂载目录的权限自然匹配,以后也不会再出现权限问题。
方案三:临时宽松权限(仅开发环境临时使用,不推荐生产)
如果你只是想快速解决问题测试功能,可以给storage目录设置宽松权限:
sudo chmod -R 777 ./src/storage
或者进入容器内执行:
docker-compose exec app chmod -R 777 /var/www/html/storage
⚠️ 注意:这个方法会让所有用户都能读写该目录,生产环境绝对不能用,安全性极差。
额外提示
Laravel除了storage目录,bootstrap/cache目录也需要读写权限,所以上面的权限修改最好覆盖这两个目录,或者直接整个src目录。
内容的提问来源于stack exchange,提问作者ltdev

