PHP Docker应用提交数据至数据库时访问被拒绝报错排查
问题修复指南
核心错误原因
连接失败是两个基础问题导致的:
- 你把Docker Compose专属的环境变量引用语法
${变量名}直接写到了PHP代码中,PHP原生不识别这种语法,不会做变量替换 - PHP中单引号包裹的字符串不会解析变量,代码里的
'${MYSQL_USER}'会被作为纯文本字符串传给MySQL,报错信息里显示的拒绝访问用户就是这串原文字符,和你预期传入的数据库账号完全不符
另外注意:Docker注入到容器内的环境变量,不能直接在PHP中通过$变量名的形式读取,必须通过getenv()函数或者$_ENV超全局数组获取。
具体修复步骤
修改数据库连接文件
把dbconnect.php的原有连接逻辑替换为如下内容,通过PHP内置方法读取容器环境变量:<?php $conn = mysqli_connect( 'webappdb', getenv('MYSQL_USER'), getenv('MYSQL_PASSWORD'), getenv('MYSQL_DATABASE') ); if(!$conn){ die("ERROR - Could not connect: " . mysqli_connect_error()); } ?>你之前硬编码凭证可以正常运行,说明PHP的mysqli扩展已安装、容器间网络连通正常,这部分不需要额外调整。
修复MySQL持久化配置(强烈建议操作)
你当前db服务的卷挂载路径配置错误,MySQL官方镜像默认数据存储在容器内/var/lib/mysql路径下,现在把宿主机路径挂载到/home/app等于完全没做数据持久化,容器删除后所有数据库数据都会丢失。把docker-compose.yml中db服务的volumes配置改成如下即可:volumes: - db:/var/lib/mysql如果需要绑定到你指定的宿主机目录,就改成:
volumes: - /home/fikradev/dbvolume:/var/lib/mysql注意提前给宿主机的
/home/fikradev/dbvolume目录设置合适的读写权限,避免MySQL启动时因权限不足报错。重启服务生效
改完配置后在docker-compose.yml所在目录执行如下命令重建web服务:docker-compose up -d --build web等服务启动完成后再测试注册功能即可正常连接数据库。
内容的提问来源于stack exchange,提问作者FikraOps
相关产品推荐
相关产品推荐

