[英]Sequelize cannot sync to MySQL in a docker container from Node/express app (ECONNREFUSED)
我第一次同时使用 sequelize、MySQL 和 docker,但无法通过 sequelize 连接到数据库。
我已经用 DBeaver 测试了数据库的存在,我可以连接。 当我通过 DBeaver 连接时,我还可以在终端中看到 MySQL 容器的响应。 但是,当尝试使用代码连接时,出现 ECONNREFUSED 错误。
我已经使用 sequelize 文档检查了我的代码并仔细检查了端口设置,但似乎看不出我哪里出错了。
networks:
- app-tier
docker-compose.yml 文件:
version: '3'
networks:
app-tier:
driver: bridge
services:
server:
image: bitnami/node
networks:
- app-tier
command: "sh -c 'npm install && npm run dev'"
volumes:
- ./server:/app
ports:
- 5000:5000
depends_on:
- mysql
mysql:
image: 'bitnami/mysql:latest'
environment:
- MYSQL_USER=root
- MYSQL_PASSWORD=password
- MYSQL_ROOT_PASSWORD=password
- MYSQL_DATABASE=school
networks:
- app-tier
ports:
- '3306:3306'
volumes:
- ./db:/bitnami/mysql/data
续集连接:
const Sequelize = require('sequelize');
const sequelize = new Sequelize('school', 'root', 'password', {
dialect: 'mysql'
});
module.exports = sequelize;
尝试从 app.js 同步:
sequelize.sync()
.then(result => console.log(result))
.catch(err => console.log('EEEERRRROOOOOOR',err));
终端输出:
server_1 | { SequelizeConnectionRefusedError: connect ECONNREFUSED 127.0.0.1:3306
server_1 | at Utils.Promise.tap.then.catch.err (/app/node_modules/sequelize/lib/dialects/mysql/connection-manager.js:139:19)
server_1 | at tryCatcher (/app/node_modules/bluebird/js/release/util.js:16:23)
server_1 | at Promise._settlePromiseFromHandler (/app/node_modules/bluebird/js/release/promise.js:512:31)
server_1 | at Promise._settlePromise (/app/node_modules/bluebird/js/release/promise.js:569:18)
server_1 | at Promise._settlePromise0 (/app/node_modules/bluebird/js/release/promise.js:614:10)
server_1 | at Promise._settlePromises (/app/node_modules/bluebird/js/release/promise.js:689:18)
server_1 | at Async._drainQueue (/app/node_modules/bluebird/js/release/async.js:133:16)
server_1 | at Async._drainQueues (/app/node_modules/bluebird/js/release/async.js:143:10)
server_1 | at Immediate.Async.drainQueues (/app/node_modules/bluebird/js/release/async.js:17:14)
server_1 | at runCallback (timers.js:810:20)
server_1 | at tryOnImmediate (timers.js:768:5)
server_1 | at processImmediate [as _immediateCallback] (timers.js:745:5)
server_1 | name: 'SequelizeConnectionRefusedError',
server_1 | parent:
server_1 | { Error: connect ECONNREFUSED 127.0.0.1:3306
server_1 | at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1191:14)
server_1 | errno: 'ECONNREFUSED',
server_1 | code: 'ECONNREFUSED',
server_1 | syscall: 'connect',
server_1 | address: '127.0.0.1',
server_1 | port: 3306,
server_1 | fatal: true },
server_1 | original:
server_1 | { Error: connect ECONNREFUSED 127.0.0.1:3306
server_1 | at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1191:14)
server_1 | errno: 'ECONNREFUSED',
server_1 | code: 'ECONNREFUSED',
server_1 | syscall: 'connect',
server_1 | address: '127.0.0.1',
server_1 | port: 3306,
server_1 | fatal: true } }
要从 docker 容器连接到您的 mysql 服务器,您需要传递正确的服务地址。 所以你的初始化应该是这样的。
const Sequelize = require('sequelize');
const sequelize = new Sequelize('school', 'root', 'password', {
host: 'mysql',
dialect: 'mysql'
});
module.exports = sequelize;
正在进行的工作我正在与类似的问题作斗争,这是我静态寻址的步骤:
networks:
internal_UJJigBWx:
driver: bridge
ipam:
config:
- subnet: 172.16.238.0/24
driver: default
services:
express:
build:
context: .
depends_on:
- sql
environment:
DB_DATABASE: sequebase
DB_DIALECT: mysql
DB_HOST: 172.16.238.2
DB_PASSWORD: sequeword
DB_USERNAME: sequeuser
networks:
internal_UJJigBWx:
ipv4_address: 172.16.238.3
ports:
- 80:3000/tcp
sql:
environment:
MYSQL_DATABASE: sequebase
MYSQL_PASSWORD: sequeword
MYSQL_RANDOM_ROOT_PASSWORD: "yes"
MYSQL_USER: sequeuser
image: bitnami/mysql:latest
networks:
internal_UJJigBWx:
ipv4_address: 172.16.238.2
version: '3.0'
主要区别在于ipam的静态寻址。 您可以使用docker-compose config
来检查和查看 env 扩展。
我在构建阶段使用 gulp 任务来调用 sequelize 同步。 它在本地运行良好,但我不确定是否是 docker compose 的好方法
构建映像过程使用args而不是environment
。 这个阶段似乎发生在数据库启动之前。 我不知道如何等待 sql 同步续集...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.