Docker-Compose部署:应用容器连接MySQL遭权限拒绝报错
解决Docker容器中应用连接MySQL的权限问题
1. 修正容器间连接的Host地址
Docker Compose会自动为服务创建专属网络,同一网络内的服务可以通过服务名直接访问。你的应用容器不需要使用host.docker.internal(该地址用于访问宿主机),应将数据库连接的host改为mysql(即MySQL服务的名称)。
修改代码中的数据库配置:
database: { host: 'mysql', // 替换原有的host.docker.internal port: 3306, database: process.env['MYSQL_DATABASE'], user: process.env['MYSQL_USER'], password: process.env['MYSQL_PASSWORD'] }
2. 调整MySQL用户权限与环境变量配置
核心问题分析
- MySQL官方镜像中,
MYSQL_USER和MYSQL_PASSWORD是用于创建普通用户的环境变量,而非配置root用户;你的MySQL容器仅设置了root密码,未处理远程访问权限。 - MySQL默认root用户仅允许从
localhost登录,应用容器连接时的客户端IP是容器网络内的地址,因此会被拒绝访问。
解决方案二选一
方式A:授权root用户允许远程访问
修改docker-compose.yml中MySQL服务的配置,添加初始化脚本:
mysql: image: mysql:5.6 volumes: - db-data:/var/lib/mysql - ./init.sql:/docker-entrypoint-initdb.d/init.sql # 挂载初始化脚本 environment: MYSQL_ROOT_PASSWORD: myawesomepassword MYSQL_DATABASE: myawesomedb command: --init-file /docker-entrypoint-initdb.d/init.sql
在当前目录创建init.sql文件,写入权限授权语句:
GRANT ALL PRIVILEGES ON myawesomedb.* TO 'root'@'%' IDENTIFIED BY 'myawesomepassword'; FLUSH PRIVILEGES;
方式B:创建专用普通用户(更安全)
修改docker-compose.yml,让MySQL镜像自动创建普通用户,并同步应用容器的环境变量:
services: app: image: my-app:latest ports: - 8000:8000 working_dir: /usr/app/MyApp environment: MYSQL_DATABASE: myawesomedb MYSQL_USER: appuser # 自定义普通用户名 MYSQL_PASSWORD: apppassword # 自定义密码 mysql: image: mysql:5.6 volumes: - db-data:/var/lib/mysql environment: MYSQL_ROOT_PASSWORD: myawesomepassword MYSQL_DATABASE: myawesomedb MYSQL_USER: appuser MYSQL_PASSWORD: apppassword
3. 清理旧数据卷(若之前启动过容器)
如果已经启动过MySQL容器,数据卷中可能残留旧的权限配置,需删除后重新启动:
docker-compose down -v docker-compose up -d
内容的提问来源于stack exchange,提问作者afontalv
相关产品推荐
相关产品推荐

