Yii容器化部署失败主因是PHP扩展缺失(pdo_mysql、mbstring、xml、json、ctype)、Web服务器DocumentRoot路径与AllowOverride配置错误、数据库host误写localhost;需用php:8.2-apache镜像,安装并启用全部扩展,正确配置Apache/Nginx入口路径、服务名及runtime/assets目录权限。
Yii 容器化部署失败,八成卡在三个地方:PHP 扩展没装全、Apache/Nginx 路径配错、数据库 host 写成了
。不是代码问题,是容器网络和权限模型变了,得按 Docker 的规则重配。
PHP 扩展缺失导致容器启动即退出
容器里跑
或
一看,
、
、
、
、
少一个,Yii 3.x 就直接报错退出;Yii 2.x 虽能硬扛,但路由、表单验证、JSON 返回全崩。
别用
镜像——
编译依赖太多,容易卡在
上,改用
或
这行必须完整,漏掉
会导致 Yii 3.x 的
初始化失败
装完必须跟一句
,某些镜像(如 Debian 系)安装后不自动启用
检查
是否指向你改过的
,而不是只读的镜像内置副本
Web 服务返回 403/404:DocumentRoot 和 AllowOverride 没对上
浏览器打开全是 403 Forbidden 或 404 Not Found,不是代码路径错了,是 Apache/Nginx 根本没把请求交给
处理。Yii 依赖
(Apache)或重写规则(Nginx),但默认配置全关着。
Apache 场景下,
必须是
(Yii 2.x)或
(Yii 3.x),绝不能是项目根目录
块里必须有
和
,否则
被无视
Nginx 场景下,
块要包含
,且
指向 PHP-FPM 服务名(如
),不是
别在
目录放空
——如果
没加载,它会触发 500 错误,而 Docker 默认不暴露 Apache 错误日志
数据库连接 refused:host 写死 localhost 是最大陷阱
本地
成功,一进容器就报
,基本可以确定是
里还写着
。
Docker 容器内
指自己,不是宿主机,更不是隔壁的 MySQL 容器。必须改成
(或你在
里定义的服务名)
不要用
这类 fallback——环境变量没设时会退到
,反而掩盖问题
加
:在
服务里写
,再让 app 服务
调试时别等 Yii 报错,进 PHP 容器直接跑:
和
,10 秒内就能定位是 DNS 解析失败还是端口不通
runtime 和 assets 权限不对,页面白屏或 CSS/JS 加载失败
前端能打开,但登录后跳转空白、图标不显示、资源 404,大概率是
和
目录权限没给
(Apache)或
/
(Nginx + PHP-FPM)写入权。
构建镜像时加一行:
如果是挂载本地目录(开发模式),宿主机需提前
,否则容器内
用户无法写入
Yii 3.x 默认用
,注意路径别写成
;Yii 2.x 是
,但部分 Starter Kit 改过结构,以实际
配置为准
别在
里用
代替显式
——某些文件系统(如 macOS Docker Desktop)不支持该 flag
最常被忽略的是:容器内时间同步、时区未设、
在开发中没关,导致改了代码却一直看到旧页面。这些不会报错,但会让调试变成玄学。
localhostphp -vphpinfo()pdo_mysqlmbstringxmljsonctypephp:8.2-alpinepdo_mysqllibmysqlclientphp:8.2-apachephp:8.2-fpmRUN docker-php-ext-install pdo pdo_mysql mbstring xml ctype jsonctypeBaseObjectRUN docker-php-ext-enable pdo pdo_mysql mbstring xml ctype jsonLoaded Configuration File/usr/local/etc/php/php.iniindex.php.htaccessDocumentRoot/var/www/html/web/var/www/html/publicAllowOverride AllRequire all granted.htaccesslocation /try_files $uri $uri/ /index.php?$args;fastcgi_passphp:9000127.0.0.1:9000web/.htaccessmod_rewritephp yii migrateSQLSTATE[HY000] [2002] Connection refusedconfig/db.php'host' => 'localhost'localhostdbdocker-compose.ymlgetenv('DB_HOST') ?: 'localhost'localhosthealthcheckdbhealthcheck: test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "-proot"]depends_on: { db: { condition: service_healthy } }ping dbnc -zv db 3306runtimeassetswww-datawww-datanginxRUN chown -R www-data:www-data /var/www/html/runtime /var/www/html/assetschown -R $(id -u):$(id -g) runtime assetswww-datapublic/assetsweb/assetsweb/assetsAssetManager::basePathDockerfileCOPY --chown=www-data:www-data . .chownopcache.revalidate_freq