PMA_HOSTS环境变量仅影响登录页下拉列表显示,不自动配置认证或端口,需配合config.user.inc.php中连续索引的$cfg['Servers']数组、同一Docker网络及host可解析才生效。
为什么PMA_HOSTS环境变量不生效
直接写 pma_hosts=db,db2 通常没用——phpmyadmin官方镜像的 pma_hosts 只在特定启动模式下才被解析,且要求所有服务器必须在同一 docker 网络中、能通过容器名互相解析。更关键的是,它只影响登录页下拉列表的显示逻辑,不自动配置每个服务器的认证方式或端口。
真正起作用的是 config 文件里的 $cfg['Servers'] 数组。环境变量只是“快捷入口”,底层仍需完整定义。
-
PMA_HOSTS仅适用于 cookie 认证 + 单 root 用户直连多个同构 MySQL 实例(比如全是 8.0、都用 root/rootpass) - 一旦涉及不同端口、不同用户、不同认证方式(如 http / signon),必须手写
config.inc.php - 官方镜像默认不挂载自定义 config,
PMA_HOSTS就成了摆设
怎么让多服务器在登录页正常显示下拉框
核心是确保 $cfg['Servers'] 数组索引从 1 开始、连续、无跳空,且每个元素都包含 host 和 auth_type。
不要手动写 $i=0; $i++; $cfg['Servers'][$i] = [...] —— 容易漏掉 $i++ 或重复使用同一索引。
- 用 foreach 循环最安全:
$servers = [ ['name' => '开发库', 'host' => 'db-dev', 'port' => 3306, 'user' => 'devuser'], ['name' => '测试库', 'host' => 'db-test', 'port' => 3307, 'user' => 'testuser'], ]; $i = 0; foreach ($servers as $s) { $i++; $cfg['Servers'][$i]['host'] = $s['host']; $cfg['Servers'][$i]['port'] = $s['port'] ?? '3306'; $cfg['Servers'][$i]['verbose'] = $s['name']; $cfg['Servers'][$i]['auth_type'] = 'cookie'; $cfg['Servers'][$i]['user'] = $s['user'] ?? ''; } - 确认
$cfg['ServerDefault'] = 0;(不预选任何服务器),否则下拉框可能被强制隐藏 - 如果用了
config.user.inc.php,必须挂载到/etc/phpmyadmin/config.user.inc.php,且文件末尾不能有 PHP closing tag?>
容器里怎么挂载自定义 config 文件
Docker 启动时,/etc/phpmyadmin 下的 config 文件不会自动加载,除非显式挂载并确保路径和权限正确。
立即学习“PHP免费学习笔记(深入)”;
常见错误是把 config 放错位置,或者用了只读挂载但 phpMyAdmin 尝试写日志导致启动失败。
- 挂载命令必须带完整路径:
docker run -v $(pwd)/config.user.inc.php:/etc/phpmyadmin/config.user.inc.php ... - 文件权限要为 644,属主可以是 root,但不能是 600(php-fpm 进程读不了)
- 如果用 docker-compose,写法是:
volumes: - ./config.user.inc.php:/etc/phpmyadmin/config.user.inc.php:ro
注意加:ro明确只读 - 别忘了网络互通:所有目标 MySQL 容器必须和 phpMyAdmin 在同一个
docker network里,否则host值(如db-dev)根本无法解析
连接外部非容器 MySQL 时的坑
当 MySQL 是宝塔直装、或运行在宿主机、或跨机器时,host.docker.internal 并不可靠——它只在 Docker Desktop for Mac/Windows 有效,Linux 上默认不存在。
硬填 172.17.0.1 也不保险,因为 Docker bridge 网络网关地址可能随安装方式变化。
- 最稳的方式是用宿主机真实内网 IP(如
192.168.1.100),并确保 MySQL 的bind-address设为0.0.0.0,且用户授权允许该 IP 连接 - 如果必须用
host.docker.internal,Linux 下要手动添加:--add-host=host.docker.internal:host-gateway -
PMA_ARBITRARY=1必须设,否则 phpMyAdmin 会拒绝连接非白名单 host(默认只认localhost和容器名) - 别漏
MYSQL_ROOT_PASSWORD:即使连外部 MySQL,这个环境变量也得填(随便值),否则官方镜像卡在初始化检查
实际跑通的关键,不在堆参数,而在三点:config 数组索引连续、容器网络互通、host 值能被真实解析。少一个,登录页就只剩一个选项,或者空白。



















