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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 04:56:09