如何在Docker中解决WP-CLI与MariaDB的连接失败问题
解决WP-CLI与MariaDB连接问题的方案
1. 修正容器启动顺序(核心问题)
你先启动WP-CLI再启动MariaDB,导致WP-CLI启动时数据库还未就绪。用Docker Compose的健康检查机制,确保MariaDB完全启动后再启动WP-CLI:
在docker-compose.yaml中修改服务配置:
services: mariadb: build: ./srcs/mariadb environment: MYSQL_ROOT_PASSWORD: your_root_password DATABASE_NAME: wp_database MYSQL_USER: wp_user MYSQL_PASSWORD: wp_user_password healthcheck: test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "-p${MYSQL_ROOT_PASSWORD}"] interval: 5s timeout: 5s retries: 5 volumes: - mariadb_data:/var/lib/mysql # 挂载数据卷避免数据丢失 wp-cli: build: ./srcs/wp-cli depends_on: mariadb: condition: service_healthy volumes: - wp_data:/var/www/html environment: DB_HOST: mariadb # 用Docker服务名作为数据库主机,内部DNS会自动解析 DB_NAME: wp_database DB_USER: wp_user DB_PASSWORD: wp_user_password volumes: mariadb_data: wp_data:
2. 修复MariaDB启动脚本的可靠性问题
你的脚本依赖固定时长sleep 30,且存在root密码初始化逻辑漏洞,修改srcs/mariadb/tools/script.sh:
#!/bin/bash # 确保数据目录权限正确 chown -R mysql:mysql /var/lib/mysql chmod -R 755 /var/lib/mysql # 启动MariaDB后台进程 mysqld_safe --datadir=/var/lib/mysql & # 循环等待MariaDB真正就绪(替代sleep,避免假等待) until mysqladmin ping -h localhost --silent; do echo "Waiting for MariaDB to initialize..." sleep 2 done # 初始化root密码(第一次启动时设置) mysql -u root << EOF ALTER USER 'root'@'localhost' IDENTIFIED BY '$MYSQL_ROOT_PASSWORD'; FLUSH PRIVILEGES; EOF # 创建WordPress数据库和授权用户 cat << EOF > db_init.sql CREATE DATABASE IF NOT EXISTS $DATABASE_NAME; CREATE USER IF NOT EXISTS '$MYSQL_USER'@'%' IDENTIFIED BY '$MYSQL_PASSWORD'; GRANT ALL PRIVILEGES ON $DATABASE_NAME.* TO '$MYSQL_USER'@'%'; FLUSH PRIVILEGES; EOF # 本地执行SQL,无需指定外部主机 mysql -u root -p$MYSQL_ROOT_PASSWORD < db_init.sql # 接管MariaDB主进程,保证容器正常运行 wait %1
3. 确保MariaDB允许外部容器连接
修改srcs/mariadb/conf/50-server.cnf,设置绑定所有网卡:
[mysqld] bind-address = 0.0.0.0 # 保留其他原有配置,比如character-set-server=utf8mb4等
4. 调整WP-CLI的连接逻辑
在WP-CLI的启动脚本中,增加数据库连接校验,确保操作前数据库可用:
#!/bin/bash # 额外校验数据库连接(双重保险) until wp db check --path=/var/www/html; do echo "Waiting for database connection..." sleep 2 done # 执行WordPress初始化 wp core install --path=/var/www/html \ --url=localhost \ --title="Your Site" \ --admin_user=admin \ --admin_password=admin_pass \ --admin_email=admin@example.com # 创建普通用户 wp user create editor editor@example.com --path=/var/www/html \ --user_pass=editor_pass \ --role=editor # 根据你的容器配置启动服务,比如nginx exec nginx -g "daemon off;"
排查验证步骤
- 进入MariaDB容器检查数据库和用户:
docker exec -it [mariadb容器名] mysql -u root -p SHOW DATABASES; SELECT User, Host FROM mysql.user; - 进入WP-CLI容器测试连接:
docker exec -it [wp-cli容器名] wp db check --path=/var/www/html - 查看容器日志定位错误:
docker logs [mariadb容器名] docker logs [wp-cli容器名]
内容的提问来源于stack exchange,提问作者acbst0
相关产品推荐
相关产品推荐

