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

如何解决Docker Compose中Sequelize迁移命令的MySQL权限拒绝问题?

问题:Sequelize CLI 连接 MySQL 容器时权限被拒绝

错误信息

Sequelize CLI [Node: 21.7.1, CLI: 6.6.2, ORM: 6.37.1]
|
| Loaded configuration file "database/config/config.json".
| Using environment "production".
| ERROR: Access denied for user 'root'@'172.21.0.3' (using password: YES)

环境与操作

  • 已配置 .env.production 文件
  • 执行启动命令:sudo docker compose --env-file ./.env.production up --build
  • 项目类型:NextJS,目标是启动 MySQL 容器并执行 Sequelize 迁移构建应用

配置文件

docker-compose.yml

version: '3.8'

networks:
  common:
    driver: bridge

services:
  db:
    networks: 
      - common
    container_name: database
    volumes:
      - mysql_data:/var/lib/mysql
    restart: on-failure
    ports:
      - 3306:3306
    build:
      context: .
      dockerfile: Dockerfile.mysql
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-p$MYSQL_ROOT_PASSWORD"]
      interval: 1s
      retries: 120
      
  adminer:
    image: adminer
    restart: always
    container_name: adminer-g-database
    links:
      - db:db
    ports:
      - 8080:8080
    
  app:
    networks:
      - common
    build:
      context: .
      dockerfile: Dockerfile.app
    container_name: g-app
    restart: always
    links:
      - db:db
    ports:
      - 3000:3000
    depends_on:
      db: 
        condition: service_healthy

    command: sh -c "npx sequelize-cli db:migrate && npm install && npm run build && npm start"
    volumes:
      - .:/usr/src/app
      - /usr/src/app/node_modules

volumes:
  mysql_data:
    driver: local

Dockerfile.mysql

#Create MySQL
FROM mysql

LABEL name=gel

EXPOSE 3306

解决步骤

1. 给 MySQL 容器添加初始化环境变量

MySQL 官方镜像需要特定环境变量来配置 root 用户密码和数据库,在 docker-compose.yml 的 db 服务中添加:

services:
  db:
    # 保留原有配置,新增以下内容
    environment:
      MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
      MYSQL_DATABASE: ${MYSQL_DATABASE}

同时确保 .env.production 包含对应配置:

MYSQL_ROOT_PASSWORD=你的root密码
MYSQL_DATABASE=应用要使用的数据库名

2. 修复健康检查的变量解析问题

原健康检查命令无法正确解析环境变量,修改为 shell 模式:

healthcheck:
  test: ["CMD-SHELL", "mysqladmin ping -p${MYSQL_ROOT_PASSWORD}"]
  interval: 5s # 1s间隔过于频繁,调整为5s更合理
  retries: 20

3. 修正 Sequelize 配置的数据库地址

database/config/config.json 的 production 配置中,主机需要用容器服务名 db 而非 IP,同时确保凭证与环境变量一致:

{
  "production": {
    "username": "root",
    "password": "${MYSQL_ROOT_PASSWORD}",
    "database": "${MYSQL_DATABASE}",
    "host": "db",
    "dialect": "mysql"
  }
}

若 Sequelize 无法直接读取环境变量,需在配置文件顶部引入 dotenv 加载 .env.production。

4. 清理旧数据卷(若之前初始化有误)

如果之前 MySQL 容器生成的 data 卷存在旧权限配置,需删除后重新初始化:

docker-compose down -v

再重新执行启动命令:

sudo docker compose --env-file ./.env.production up --build

5. 验证数据库连接

通过 adminer 确认连接正常:

  • 访问 http://localhost:8080
  • 服务器填写 db,用户名 root,密码填 .env.production 中的值,数据库名填配置的名称,测试连接是否成功。

内容的提问来源于stack exchange,提问作者Naeem Ahmed

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 05:35:03