无法使用 typeorm 连接到 postgres

Unable to connect to postgres with typeorm

我有这个 docker-compose.infra.yaml 配置:

version: '3.1'

services:
  db:
    image: postgres
    restart: always
    ports: 
      - "5432:5432"
    environment:
      POSTGRES_PASSWORD: postgres
      POSTGRES_USERNAME: postgres

networks:
    default:
        external:
            name: learning

连同这个 docke-compose.yaml 配置:

version: '3.1'

services:
  web_app:
    container_name: web_app
    image: node:14
    entrypoint:
      ["/bin/sh", "-c", "yarn start:dev --preserveWatchOutput"]
    working_dir: /app
    volumes:
      - ./:/app
    ports:
      - 3001:3000

networks:
  default:
      external:
          name: learning

我将其启动为:

start.infra.sh

#!/bin/bash

docker network create learning

docker-compose -f docker-compose.infra.yaml start

start.sh

#!/bin/bash

docker network create learning

docker-compose up

make start:

.PHONY: start
start:
    @./start-infra.sh
    @./start.sh

我的数据库已启动并且 运行,我可以使用 pgAdmin 使用如下凭据连接到它:

密码是postgres。这是我的 nest.js 代码:

@Module({
  imports: [
    TasksModule,
    TypeOrmModule.forRoot({
      type: 'postgres',
      host: 'localhost',
      port: 5432,
      username: 'postgres',
      password: 'postgres',
      database: 'postgres',
      autoLoadEntities: true,
      synchronize: true,
    }),
    AuthModule,
  ],
  controllers: [],
  providers: [],
})
export class AppModule {}

虽然在我看来我做的一切都正确,但我一定是遗漏了一些东西,因为我无法从代码连接到数据库。我错过了什么?

host: 'localhost',

应该是:

host: 'db',

在容器中,postgres DNS 名称与服务名称相同,db,而不是 localhost。默认情况下,每个容器都有自己独立的网络命名空间,包括一个私有 localhost,它只与容器通信,不与其他容器通信,也不与您的外部主机通信。