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

Docker Compose MySQL远程CentOS7服务器连接失败:Access Denied

解决Docker Compose栈中Flask连接MySQL的权限拒绝问题

以下是针对跨环境(Windows本地→CentOS远程)遇到的Access denied for user 'root'@'172.18.0.x'错误的排查和解决步骤:

1. 验证Docker Secrets的实际内容与读取权限

虽然本地和远程仅密码文件路径不同,但远程服务器的Secrets可能存在挂载或内容问题:

  • 进入Flask容器查看密码文件内容:
    docker exec <你的Flask容器ID/名称> cat /run/secrets/<你的密码Secret名称>
    
    确认输出的密码与你设置的完全一致(注意是否包含多余的换行符,很多编辑器保存时会自动加换行,导致密码匹配失败)。
  • 检查密码文件的权限:
    docker exec <你的Flask容器ID/名称> ls -l /run/secrets/<你的密码Secret名称>
    
    确保文件权限允许Flask进程读取(通常权限为r--r-----,所属用户/组为root即可)。

2. 修正连接字符串中的密码处理

如果密码文件包含换行符,Flask读取时会把换行符当作密码的一部分,导致验证失败:

  • 在Flask代码中读取密码时添加strip()处理:
    with open('/run/secrets/mysql_root_password', 'r') as f:
        db_password = f.read().strip()
    

3. 再次确认MySQL root用户的主机权限

即使你之前检查过权限,再次验证远程MySQL容器中的root用户配置:

  • 进入MySQL容器执行:
    docker exec <你的MySQL容器ID/名称> mysql -u root -p
    
    输入密码登录后执行:
    SELECT user, host FROM mysql.user WHERE user = 'root';
    
    确保结果中存在root@'%'(允许所有主机/容器连接),如果只有root@localhost或特定IP,执行以下语句更新权限:
    ALTER USER 'root'@'%' IDENTIFIED BY '<你的密码>';
    FLUSH PRIVILEGES;
    
    注意:如果用Secrets初始化密码,这里的密码要和Secret文件中的内容一致。

4. 检查MySQL服务的环境变量配置

确保Compose中MySQL服务正确使用Secrets来设置root密码,而非明文环境变量:

  • 你的docker-compose.yml中MySQL部分应类似:
    services:
      mysql:
        image: mysql:latest
        secrets:
          - mysql_root_password
        environment:
          MYSQL_ROOT_PASSWORD_FILE: /run/secrets/mysql_root_password
          # 其他环境变量...
    secrets:
      mysql_root_password:
        file: ./path/to/your/password/file  # 远程服务器上的正确路径
    
    避免同时设置MYSQL_ROOT_PASSWORD和MYSQL_ROOT_PASSWORD_FILE,这会导致MySQL优先使用明文变量,和Secrets内容不一致。

5. 排除Docker版本差异的影响

远程Docker版本(23.0.0)与本地(20.10.22)存在差异,可尝试以下操作:

  • 重启Docker服务:
    sudo systemctl restart docker
    
  • 重新创建整个栈(确保彻底清理旧资源):
    docker compose down -v
    docker compose up -d
    

6. 临时用明文密码测试(排查Secrets问题)

为了确认是否是Secrets导致的问题,可临时修改docker-compose.yml,用明文密码替代Secrets:

services:
  mysql:
    environment:
      MYSQL_ROOT_PASSWORD: "你的明文密码"
  # Flask服务中也对应修改为明文密码连接

如果此时Flask能正常连接MySQL,说明问题出在Secrets的配置或读取上,回到步骤1重新排查。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 21:46:05