如何解决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
相关产品推荐
相关产品推荐

