Docker:NestJS 和 MySQL ECONNREFUSED 127.0.0.1:3306

问题描述 投票:0回答:1

我有这个文件:

docker-compose-yml

version: "3.8"
services:
  mysql:
    image: mysql:8.0
    container_name: mysql_db
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: db_crud
      MYSQL_USER: user_crud
      MYSQL_PASSWORD: root
    volumes:
      - ./mysql:/var/lib/mysql
    ports:
      - "3307:3306"
  backend:
    build:
      context: ./backend
      dockerfile: Dockerfile-backend
    container_name: backend_service
    restart: always
    depends_on:
      - mysql
    ports:
      - "3001:3000"

Dockerfile-后端

FROM node:18
WORKDIR /app
COPY . .
RUN yarn install
EXPOSE 3000
CMD ["yarn", "start"]

app.module.ts

TypeOrmModule.forRoot({
  type: 'mysql',
  host: 'localhost',
  port: 3307,
  username: 'user_crud',
  password: 'root',
  database: 'db_crud',
  autoLoadEntities: true,
  synchronize: true,
}),

我在运行时遇到

docker compose up
这个错误:

backend_service | [Nest] 41  - 01/11/2024, 12:13:01 AM   ERROR [TypeOrmModule] Unable to connect to the database. Retrying (1)...
backend_service | Error: connect ECONNREFUSED 127.0.0.1:3307
backend_service |     at TCPConnectWrap.afterConnect [as oncomplete] (node:net:1555:16)

为什么? 我尝试在

app.module.ts
上使用 3307 和 3306,但出现相同的错误(错误消息中的端口值不同)。

有什么想法吗?

docker-compose nestjs
1个回答
0
投票

在你的 docker-compose 文件中,我认为有一些地方需要修复。

尝试添加网络

为了解决这个问题,我更改了 app.module.ts 文件。

TypeOrmModule.forRoot({
  type: 'mysql',
  host: 'mysql',
  port: 3306,
  username: 'user_crud',
  password: 'root',
  database: 'db_crud',
  autoLoadEntities: true,
  synchronize: true,
}),

并得到了结果。

当您使用 docker-compose 时,网络的工作方式有所不同。 容器将使用docker内部网络。 在你的docker-compose中,mysql服务是mysql(不是容器名称)。所以我在host上写了一个mysql。这将使 docker 找到本地 docker 容器。

你可以检查我的 git 存储库链接

祝你好运!

© www.soinside.com 2019 - 2024. All rights reserved.