解决本地及同Docker网络容器连接MySQL容器的权限拒绝问题
修复MySQL容器连接错误的方案
1. 修正Docker Compose的网络配置错误
你的docker-compose.yml中网络部分YAML格式存在错误,driver: bridge需要缩进在internal网络条目下,否则网络配置不生效,会导致容器间网络连通性异常。修正后的配置如下:
version: "3.3" services: db-server: container_name: database image: mysql:latest environment: MYSQL_ROOT_PASSWORD: rootTest MYSQL_USER: soumalya MYSQL_PASSWORD: userTest ports: - "3031:3306" networks: - internal volumes: - mysql:/var/lib/mysql - ./init.sql:/docker-entrypoint-initdb.d/init.sql:ro restart: unless-stopped networks: internal: driver: bridge # 修正缩进,确保网络配置生效 volumes: mysql:
2. 补充用户远程访问授权
MySQL默认root用户仅允许localhost登录,同时当前init.sql未对soumalya用户授予全局权限,导致跨容器连接失败。修改init.sql添加必要授权:
create database if not exists reviews; create database if not exists users; create database if not exists vendors; -- 授权soumalya用户访问指定数据库 GRANT ALL PRIVILEGES on reviews.* to 'soumalya'@'%'; GRANT ALL PRIVILEGES on users.* to 'soumalya'@'%'; GRANT ALL PRIVILEGES on vendors.* to 'soumalya'@'%'; -- 授权root用户从任意地址访问所有数据库 GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'rootTest'; FLUSH PRIVILEGES;
3. 清理旧数据卷(关键步骤)
若之前已启动过容器,mysql数据卷中会保留初始化后的旧数据,此时修改init.sql或环境变量不会触发重新初始化。需删除旧数据卷后重新启动:
# 停止并删除现有容器 docker-compose down # 查看并删除对应的数据卷(替换<项目目录名>为实际目录名) docker volume rm <项目目录名>_mysql # 重新启动容器 docker-compose up -d
可通过docker volume ls命令查看具体的数据卷名称
4. 移除冗余Dockerfile
你的Dockerfile仅执行ADD init.sql init.sql操作,但已经通过volume将本地init.sql挂载到容器的/docker-entrypoint-initdb.d/目录(MySQL会自动执行该目录下的SQL文件),因此该Dockerfile完全冗余,可直接删除,同时去掉docker-compose.yml中的build配置项。
验证连接
- 宿主机连接测试:
mysql -h localhost -P 3031 -u root -prootTest
- 同一
internal网络的容器连接测试(使用服务名db-server作为主机):
mysql -h db-server -P 3306 -u soumalya -puserTest
内容的提问来源于stack exchange,提问作者Soumalya Bhattacharya
相关产品推荐
相关产品推荐

