【发布时间】: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 容器,数据库是否在容器内正确启动?你能检查一下容器日志吗?
-
尝试这些步骤,错误似乎类似stackoverflow.com/a/64487298/13961165
-
你好。是的,“db”容器在端口 3306 上运行,我可以登录以检查默认表。但是“后端”失败了。至于日志,我不确定是否不止这些。
-
您需要在应用程序中使用
db:3306(容器名称和端口)而不是127.0.0.1:3306。 -
嗯,很有趣。应用程序日志仍然显示
Error: connect ECONNREFUSED 127.0.0.1:3306。
标签: mysql node.js docker docker-compose typeorm