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名称> - 检查密码文件的权限:
确保文件权限允许Flask进程读取(通常权限为docker exec <你的Flask容器ID/名称> ls -l /run/secrets/<你的密码Secret名称>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,执行以下语句更新权限:
注意:如果用Secrets初始化密码,这里的密码要和Secret文件中的内容一致。ALTER USER 'root'@'%' IDENTIFIED BY '<你的密码>'; FLUSH PRIVILEGES;
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
相关产品推荐
相关产品推荐

