thinkphp在docker中因uid/gid不匹配导致模型缓存写入失败,需先查php进程真实uid(如82),再通过chown修改宿主机runtime属主或dockerfile预创建并赋权,最后验证cache目录权限与uid一致且可写。

ThinkPHP在Docker容器中运行时,模型缓存文件(如runtime/cache/)因UID/GID不匹配导致写入失败,表现为Class not found、模板编译卡住、路由缓存不更新等静默故障。
确认容器内PHP进程用户身份
进入容器执行:id -u www-data 或 ps aux | grep php-fpm,查出实际运行PHP的UID(常见为82或33)。若返回id: www-data: no such user,说明基础镜像未预建该用户,需改用id -u直接看主进程UID。
这一步不能跳过——不同镜像(php:8.2-apache vs alpine-php)默认用户不同,硬写www-data会失效。
宿主机挂载目录所有权同步
方法一:修改宿主机目录属主(推荐用于开发与单机部署)
在宿主机执行:sudo chown -R 82:82 ./runtime(82替换为上一步查到的真实UID)。
【必须确保宿主机存在UID为82的用户组,否则chown会静默失败】
方法二:Dockerfile内预创建并赋权(推荐用于CI/CD与多环境一致化)
在RUN composer install之后、COPY . /var/www之前插入:RUN mkdir -p /var/www/runtime/{cache,log,route,view} \&& chown -R www-data:www-data /var/www/runtime
此操作将权限固化进镜像层,避免每次启动都依赖宿主机状态。
验证模型缓存是否可写
第一步:检查runtime/cache是否存在且可写
进容器执行:ls -ld /var/www/runtime/cache,输出应含drwxr-xr-x及以上权限,且第三列所有者UID与id -u结果一致。
第二步:模拟模型缓存写入
执行:php -r "file_put_contents('/var/www/runtime/cache/test.php', '<?php echo 1;');",无报错即通过。
第三步:触发真实模型缓存生成
访问任意含模型查询的接口(如/api/user),再执行:ls -l /var/www/runtime/cache/,应看到类似model_*.php的文件,且属主UID与前两步一致。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











