NodeJS和Sequelize可以';t在docker compose中连接到MySQL
我有一个非常类似的问题出现在这里: 但不幸的是,提议的解决方案不起作用。 我有一个带有Typescript(可能不相关)、Sequelize和MySQL数据库的NodeJS项目。 我已经建立了一个docker compose文件,其中包含一些脚本,这些脚本可以根据github的脚本对它们进行设置和旋转,从而对它们进行管理NodeJS和Sequelize可以';t在docker compose中连接到MySQL,mysql,node.js,docker,docker-compose,sequelize.js,Mysql,Node.js,Docker,Docker Compose,Sequelize.js,我有一个非常类似的问题出现在这里: 但不幸的是,提议的解决方案不起作用。 我有一个带有Typescript(可能不相关)、Sequelize和MySQL数据库的NodeJS项目。 我已经建立了一个docker compose文件,其中包含一些脚本,这些脚本可以根据github的脚本对它们进行设置和旋转,从而对它们进行管理 script/setup只需为数据库创建卷并将其旋转: ... docker-compose down docker volume create --name=tournam
script/setup
只需为数据库创建卷并将其旋转:
...
docker-compose down
docker volume create --name=tournaments-data
docker-compose up -d tournaments-db
完成后,我运行script/start
,它正在启动web应用程序:
...
docker-compose up web
所有容器都正确启动,我能够使用以下命令行成功地连接到MySQL容器:MySQL-uroot-p-h127.0.0.1-p3307--protocol=tcp
,还可以使用JetBrains Datagrip
NodeJS应用程序似乎无法正确连接到mysql数据库,因为我遇到以下错误:
Unable to connect to the database: ConnectionRefusedError [SequelizeConnectionRefusedError]: connect ECONNREFUSED 127.0.0.1:3306
我尝试从所有IP(而不仅仅是本地主机)授予root访问权限,但这也不起作用。
我还认为docker compose存在网络问题,所以我验证了他们在同一个网络上(他们是),还尝试通过docker compose为他们创建一个不同的网络,但也不起作用
有人知道可能遗漏了什么吗?由于我可以从外部连接到mysql实例,我假设我缺少一些配置或类似的配置,但是在查看了许多建议的解决方案之后,这些都是无效的
另外,由于业务限制,MySQL版本被锁定,因此我无法升级/使用其他版本
Sequelize返回完整的错误消息:
web_1 | [Node] Unable to connect to the database: ConnectionRefusedError [SequelizeConnectionRefusedError]: connect ECONNREFUSED 127.0.0.1:3306
web_1 | [Node] at /usr/src/app/node_modules/sequelize/lib/dialects/mysql/connection-manager.js:123:19
web_1 | [Node] at tryCatcher (/usr/src/app/node_modules/bluebird/js/release/util.js:16:23)
web_1 | [Node] at Promise._settlePromiseFromHandler (/usr/src/app/node_modules/bluebird/js/release/promise.js:547:31)
web_1 | [Node] at Promise._settlePromise (/usr/src/app/node_modules/bluebird/js/release/promise.js:604:18)
web_1 | [Node] at Promise._settlePromise0 (/usr/src/app/node_modules/bluebird/js/release/promise.js:649:10)
web_1 | [Node] at Promise._settlePromises (/usr/src/app/node_modules/bluebird/js/release/promise.js:725:18)
web_1 | [Node] at _drainQueueStep (/usr/src/app/node_modules/bluebird/js/release/async.js:93:12)
web_1 | [Node] at _drainQueue (/usr/src/app/node_modules/bluebird/js/release/async.js:86:9)
web_1 | [Node] at Async._drainQueues (/usr/src/app/node_modules/bluebird/js/release/async.js:102:5)
web_1 | [Node] at Immediate._onImmediate (/usr/src/app/node_modules/bluebird/js/release/async.js:15:14)
web_1 | [Node] at processImmediate (internal/timers.js:439:21) {
web_1 | [Node] name: 'SequelizeConnectionRefusedError',
web_1 | [Node] parent: Error: connect ECONNREFUSED 127.0.0.1:3306
web_1 | [Node] at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1134:16) {
web_1 | [Node] errno: 'ECONNREFUSED',
web_1 | [Node] code: 'ECONNREFUSED',
web_1 | [Node] syscall: 'connect',
web_1 | [Node] address: '127.0.0.1',
web_1 | [Node] port: 3306,
web_1 | [Node] fatal: true
web_1 | [Node] },
web_1 | [Node] original: Error: connect ECONNREFUSED 127.0.0.1:3306
web_1 | [Node] at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1134:16) {
web_1 | [Node] errno: 'ECONNREFUSED',
web_1 | [Node] code: 'ECONNREFUSED',
web_1 | [Node] syscall: 'connect',
web_1 | [Node] address: '127.0.0.1',
web_1 | [Node] port: 3306,
web_1 | [Node] fatal: true
web_1 | [Node] }
web_1 | [Node] }
所以,我终于发现了问题所在。 我解决了一个问题,但导致了另一个问题。实际上,我创建的Sequelize实例没有通过主机+端口配置,因此它使用了默认配置,即
127.0.0.1:3306
基本上是这样的:
export const sequelize = new Sequelize({
database: config.database,
username: config.username,
password: config.password,
models: [path.join(__dirname, '/models')],
dialect: config.dialect,
});
与此相反:
export const sequelize = new Sequelize({
host: config.host,
port: config.port,
database: config.database,
username: config.username,
password: config.password,
models: [path.join(__dirname, '/models')],
dialect: config.dialect,
});
So config was correct, but I was just not using it properly in my code.
你能发布错误消息的完整堆栈吗?@Prabhjotsinghkaint编辑了帖子并添加了完整的输出。这是在NodeJS项目的初始加载时(该项目尝试对mysql数据库进行身份验证),数据库进程正在侦听端口3306,您需要将其用于容器间通信。无论是
暴露:
还是端口:
都不会对此产生任何影响。您显示的配置与您引用的错误消息不匹配,因此可能还缺少一点连接。可能您需要重建映像,因为@DavidMaze表示错误与您的配置不同。您需要将congis中的端口更改为3307@DavidMaze甚至当所有端口都是3306
时,@LinPy也会发生这种情况,即使将DB Config更改为3307
也不起作用。此外,我还手动修剪了每个端口更改之间的容器、卷和网络,但仍然没有任何效果
export const sequelize = new Sequelize({
database: config.database,
username: config.username,
password: config.password,
models: [path.join(__dirname, '/models')],
dialect: config.dialect,
});
export const sequelize = new Sequelize({
host: config.host,
port: config.port,
database: config.database,
username: config.username,
password: config.password,
models: [path.join(__dirname, '/models')],
dialect: config.dialect,
});
So config was correct, but I was just not using it properly in my code.