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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 18:02:01