thinkphp容器启动失败主因是runtime目录权限、composer依赖未预装或nginx未正确传递path_info;需分层构建镜像、分离挂载runtime、显式配置fastcgi_split_path_info及script_filename绝对路径。

ThinkPHP 容器启动失败,90% 是 runtime 目录权限、composer install 没跑完、或 Nginx 未正确传递 PATH_INFO 导致的——不是代码写错了,是容器环境没对齐。
runtime 目录写入失败:权限和挂载方式必须拆开处理
现象:访问页面空白,php-error.log 里反复出现 failed to open stream: Permission denied,日志、缓存、模板编译全卡在 /runtime/。
- 别在
Dockerfile里用chown -R www-data:www-data /var/www/runtime硬设权限——不同基础镜像的www-dataUID 可能不一致,重启后挂载目录权限又失效 - 构建时就创建并设宽松权限:
RUN mkdir -p /var/www/runtime/{log,cache,route,view} && chmod -R 777 /var/www/runtime - 宿主机挂载时,**禁止**
-v ./app:/var/www这种整项目挂载;改用只读 + 分离挂载:-v ./app:/var/www:ro -v ./runtime:/var/www/runtime:rw - 如果用
docker run启动,加-u www-data参数,确保 PHP 进程以容器内有权限的用户运行 - 检查
php-fpm.conf中的user和group是否与实际运行用户一致(比如镜像用www-data,但你自定义了用户却忘了同步改 fpm 配置)
Class 'think\App' not found:autoload.php 没加载或 vendor 没装全
现象:直接报类找不到,连入口都进不去,不是路由或配置问题,是自动加载链断了。
-
Dockerfile中必须在COPY代码前完成依赖安装:COPY composer.json composer.lock ./→RUN composer install --no-dev --optimize-autoloader→COPY . . - 确认
public/index.php包含require __DIR__.'/../vendor/autoload.php';(ThinkPHP 6+ 默认有,但手动删过就得补) - 别在
ENTRYPOINT或CMD里动态执行composer install——构建阶段就该确定依赖状态,否则每次启动都慢且不可控 - 运行容器后执行
docker exec -it your-app php -m | grep opcache,确保opcache已启用,否则自动加载性能会明显下降
Nginx 伪静态 404:PATH_INFO 丢失或 SCRIPT_FILENAME 错位
现象:访问 /index.php/user/login 正常,但去掉 index.php 就 404;或者所有请求都 fallback 到首页。
-
root必须指向public/目录,不能是项目根目录;例如root /var/www/html/public; -
location /块必须用:try_files $uri $uri/ /index.php?$query_string;—— 缺少$query_string会导致 GET 参数丢失 -
location ~ \.php$中必须显式设置:fastcgi_split_path_info ^(.+\.php)(/.+)$;和fastcgi_param PATH_INFO $fastcgi_path_info; -
fastcgi_param SCRIPT_FILENAME必须为绝对路径:$document_root$fastcgi_script_name,不能拼错成$fastcgi_script_name或相对路径 - 伪静态规则由 Nginx 容器负责,PHP-FPM 容器本身不处理 URL 重写;改
.htaccess或 ThinkPHP 的url_rewrite配置在纯 FPM 容器里完全无效
.env 和 runtime 多容器共用时的冲突点
现象:队列任务起不来、日志混写、缓存键错乱、甚至 flock() 失败;不是并发高,是目录被多个容器同时写。
-
.env绝对不能COPY进镜像;用docker-compose.yml的env_file:或environment:注入,并确保它落在容器内项目根目录(如/var/www/.env) - Web 容器和
queue:work容器**不能共享同一份runtime挂载**;应分离:web挂载runtime/log和runtime/cache,queue容器挂载runtime/queue和runtime/log(若需隔离可再分卷) - SELinux 主机(如 CentOS)挂载后可能静默拒绝写入,报错仍是
Permission denied,但需额外加:z或:Z标签:-v ./runtime:/var/www/runtime:z - 容器重启前,建议清空
runtime/cache/和runtime/route/,避免旧 opcode 或路由缓存干扰新版本逻辑
最易被忽略的是:Nginx 的 fastcgi_param SCRIPT_FILENAME 和 PHP-FPM 的 user/group 配置必须严格匹配容器内真实用户,差一个字符或 UID 就会静默失败;而这个问题在本地开发环境往往不暴露,一上 Docker 就卡住。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











