Docker Compose 在 MySQL 和 NodeJS 中出现错误 ECONNREFUSED 127.0.0.1:3306
Posted
技术标签:
【中文标题】Docker Compose 在 MySQL 和 NodeJS 中出现错误 ECONNREFUSED 127.0.0.1:3306【英文标题】:Docker Compose getting error ECONNREFUSED 127.0.0.1:3306 with MySQL and NodeJS 【发布时间】:2021-02-07 06:37:26 【问题描述】:我正在尝试通过在 Windows 10 主机中使用 Docker Compose 为我的 NestJS + TypeORM + mysql 环境设置一些容器,但我收到 ECONNREFUSED 错误:
connect ECONNREFUSED 127.0.0.1:3306 +2ms
backend_1 | Error: connect ECONNREFUSED 127.0.0.1:3306
backend_1 | at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1145:16)
backend_1 | --------------------
backend_1 | at Protocol._enqueue (/usr/src/app/node_modules/mysql/lib/protocol/Protocol.js:144:48)
backend_1 | at Protocol.handshake (/usr/src/app/node_modules/mysql/lib/protocol/Protocol.js:51:23)
backend_1 | at PoolConnection.connect (/usr/src/app/node_modules/mysql/lib/Connection.js:116:18)
backend_1 | at Pool.getConnection (/usr/src/app/node_modules/mysql/lib/Pool.js:48:16)
backend_1 | at /usr/src/app/node_modules/typeorm/driver/mysql/MysqlDriver.js:793:18
backend_1 | at new Promise (<anonymous>)
backend_1 | at MysqlDriver.createPool (/usr/src/app/node_modules/typeorm/driver/mysql/MysqlDriver.js:790:16)
backend_1 | at MysqlDriver.<anonymous> (/usr/src/app/node_modules/typeorm/driver/mysql/MysqlDriver.js:278:51)
backend_1 | at step (/usr/src/app/node_modules/typeorm/node_modules/tslib/tslib.js:141:27)
backend_1 | at Object.next (/usr/src/app/node_modules/typeorm/node_modules/tslib/tslib.js:122:57)
我创建了以下Dockerfile
来配置 NestJS API 容器:
FROM node:12-alpine
WORKDIR /usr/src/app
COPY package.json .
RUN npm install
EXPOSE 3000
#CMD ["npm", "start"]
CMD /wait-for-it.sh db:3306 -- npm start
COPY . .
然后我在 Docker Compose 中使用以下 docker-compose.yml
引用它:
version: "3.8"
networks:
app-tier:
driver: bridge
services:
db:
image: mysql
command: --default-authentication-plugin=mysql_native_password
restart: always
expose:
- "3306"
ports:
- "3306:3306"
networks:
- app-tier
environment:
MYSQL_DATABASE: school
MYSQL_ALLOW_EMPTY_PASSWORD: ok
MYSQL_ROOT_PASSWORD: root
MYSQL_USER: dbuser
MYSQL_PASSWORD: dbuser
MYSQL_ROOT_HOST: '%'
backend:
depends_on:
- db
build: .
ports:
- "3000:3000"
networks:
- app-tier
最后,我将 TypeORM 配置设置为与 Docker Compose 文件匹配:
export const DB_CONFIG: TypeOrmModuleOptions =
type: 'mysql',
host: 'db',
port: 3306,
username: 'dbuser',
password: 'dbuser',
database: 'school',
entities: [], // We specify the entities in the App Module.
synchronize: true,
;
我是 Docker Compose 的新手,但我尝试了很多事情,比如将输出端口更改为 3307,设置显式网络......并且当我运行它时,端口 3306 在我的主机操作系统中是免费的。有什么帮助吗?
编辑 1
我已按照建议添加了MYSQL_ROOT_HOST
和wait-for-it.sh
,但仍然没有结果。
【问题讨论】:
docker 是否正在启动 mysql 容器,数据库是否在容器内正确启动?你能检查一下容器日志吗? 尝试这些步骤,错误似乎类似***.com/a/64487298/13961165 你好。是的,“db”容器在端口 3306 上运行,我可以登录以检查默认表。但是“后端”失败了。至于日志,我不确定是否不止这些。 您需要在应用程序中使用db:3306
(容器名称和端口)而不是127.0.0.1:3306
。
嗯,很有趣。应用程序日志仍然显示Error: connect ECONNREFUSED 127.0.0.1:3306
。
【参考方案1】:
我认为您的数据库需要更多时间来启动,并且您的应用程序在数据库之前启动,请为您的 docker-compose.yml 文件尝试这样的操作:
version: "3.8"
networks:
app-tier:
driver: bridge
services:
db:
image: mysql
command: --default-authentication-plugin=mysql_native_password
restart: always
expose:
- "3306"
ports:
- "3306:3306"
networks:
- app-tier
environment:
MYSQL_DATABASE: school
MYSQL_ALLOW_EMPTY_PASSWORD: ok
MYSQL_ROOT_PASSWORD: root
MYSQL_USER: dbuser
MYSQL_PASSWORD: dbuser
MYSQL_ROOT_HOST: '%'
backend:
depends_on:
- db
build: .
command: bash -c 'while !</dev/tcp/db/3306; do sleep 1; done; npm start'
ports:
- "3000:3000"
networks:
- app-tier
【讨论】:
谢谢,它成功了。我只需要在我的 Dockerfile 中添加RUN apk update && apk add bash
以便它可以执行 bash。
你在 Dockerfile 中哪里添加了这个命令?以上是关于Docker Compose 在 MySQL 和 NodeJS 中出现错误 ECONNREFUSED 127.0.0.1:3306的主要内容,如果未能解决你的问题,请参考以下文章
在 docker-compose、nginx、mysql 和 php 上运行 wordpress
在 docker-compose 中使用 MySQL 初始化 Hibernate 时连接被拒绝
Docker-compose 多个Docker容器管理:以MYSQL和Wordpress为例
使用 docker-compose 无法在同一网络中连接 mysql 和 spring boot