You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Docker Compose部署WordPress+PHPUnit容器数据库连接失败求助

WordPress + PHPUnit Docker 容器数据库连接问题排查与解决

从你提供的日志和配置来看,核心问题是WordPress没有正确读取Docker Compose中设置的数据库用户信息,而是使用了wp-config.php里的默认值example username,导致MariaDB返回权限拒绝错误。以下是具体的排查和解决步骤:

核心错误定位

查看MariaDB日志中的关键报错:

Access denied for user 'example username'@'192.168.240.3' (using password: YES)

而你的Docker Compose中明确设置了WORDPRESS_DB_USER: wordpress,说明WordPress没有正确加载环境变量,而是使用了wp-config.php中的默认用户值。

解决步骤

1. 调整Entrypoint脚本执行顺序

你的自定义init-testing-environment.sh先执行WP-CLI检查逻辑,但此时官方WordPress镜像的docker-entrypoint.sh还未运行——这个官方脚本负责根据WORDPRESS_*环境变量生成正确的wp-config.php。

修改init-testing-environment.sh,先完成WordPress基础配置,再初始化测试环境:

#!/bin/bash

# 先启动官方entrypoint,完成WP文件复制、wp-config.php生成
bash docker-entrypoint.sh "$@" &
ENTRYPOINT_PID=$!

# 等待WP配置完成,直到数据库连接正常
until sudo -u www-data wp core is-installed --path=/var/www/html; do
    echo "等待WordPress初始化完成..."
    sleep 2
done

# 停止临时启动的Apache,后续重新启动
kill $ENTRYPOINT_PID
wait $ENTRYPOINT_PID 2>/dev/null

# 初始化插件测试环境
sudo -u www-data wp scaffold plugin-tests $WP_PLUGIN_FOLDER --force --path=/var/www/html
cd /var/www/html/wp-content/plugins/$WP_PLUGIN_FOLDER && sudo -u www-data bash -c "./bin/install-wp-tests.sh $WORDPRESS_DB_NAME $WORDPRESS_DB_USER $WORDPRESS_DB_PASSWORD $WORDPRESS_DB_HOST latest true"

# 启动Apache服务
exec apache2-foreground

2. 验证环境变量传递

进入WordPress容器,检查环境变量是否正确加载:

docker-compose -f docker-compose.phpunit.yml exec wordpress_phpunit env | grep WORDPRESS_

预期输出:

WORDPRESS_DB_HOST=mysql_phpunit:3306
WORDPRESS_DB_NAME=wordpress
WORDPRESS_DB_USER=wordpress
WORDPRESS_DB_PASSWORD=wordpress

如果没有输出,检查Docker Compose配置是否正确,确保没有volume挂载覆盖环境变量相关逻辑。

3. 手动验证数据库连接

在WordPress容器内,用mysql客户端直接测试数据库连通性:

mysql -h mysql_phpunit -u wordpress -pwordpress wordpress

如果能成功登录,说明数据库服务和用户配置正常;如果失败,重启MariaDB容器并检查其环境变量配置。

4. 修复wp-config.php的函数缺失问题

官方wp-config-docker.php包含getenv_docker函数用于读取环境变量,如果你的wp-config.php是手动创建的,确保包含该函数:

if ( ! function_exists( 'getenv_docker' ) ) {
	function getenv_docker( $env, $default ) {
		if ( file_exists( '/run/secrets/' . $env ) ) {
			return rtrim( file_get_contents( '/run/secrets/' . $env ), "\r\n" );
		}
		$val = getenv( $env );
		if ( $val !== false ) {
			return $val;
		}
		return $default;
	}
}

额外优化建议

  • 移除Dockerfile中cp -r /usr/src/wordpress /tmp/wordpress步骤:官方entrypoint会自动将WordPress文件复制到/var/www/html,手动复制可能导致冲突。
  • 保留depends_on的同时,添加数据库就绪等待逻辑:depends_on仅保证容器启动顺序,不保证数据库服务完全可用,脚本中的until循环能解决这个问题。

内容的提问来源于stack exchange,提问作者MikeiLL

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 21:30:57