Nestjs Typeorm + Postgres Docker Compose 似乎不起作用

Nestjs Typeorm + Postgres Docker Compose doesn't seem to work

我有一个带有活动 PostgreSQL 连接的 Nestjs API + TypeORM。我目前正在尝试 docker 化整个 api。

Docker 文件:

ENV DIR=/home/node/app
RUN mkdir -p ${DIR}
WORKDIR ${DIR}
COPY package*.json ./

RUN npm install

RUN npm install -g @nestjs/cli

RUN npm run build

COPY . .

EXPOSE 3000

CMD ["node", "dist/main.js"]

Typeorm 配置:

require('dotenv').config()
@Module({
  imports: [
    TypeOrmModule.forRoot({
    type: "postgres",
    host: process.env.DB_HOST,
    username: process.env.DB_USER,
    password: process.env.DB_PASSWORD,
    port: 5432,
    database: "postgres",
    entities: ["dist/**/*.entity{.ts,.js}"],
    synchronize: false }),

.env 文件:

DB_HOST=postgres
DB_PORT=5432
DB_USER=postgres
DB_PASSWORD=test

docker-compose.yaml 文件:

version: "3.9"
services:
    middleware:
        build: .
        container_name: "middleware"
        ports:
            - "3000:3000"
        depends_on:
            - postgres
        env_file:
            - .env
    postgres:
        image: "postgres:12"
        restart: always
        container_name: "postgres"
        environment:
            - POSTGRES_USER=postgres
            - POSTGRES_PASSWORD=${DB_PASSWORD}
            - POSTGRES_DB=postgres
        ports:
            - "5433:5432"
        volumes:
            - api:/var/lib/postgresql/data
            - ./src/migs/001_create.sql:/docker-entrypoint-initdb.d/001_create.sql

volumes:
    api:

我还有一个 .sql 文件,它创建了第一个表并用数据填充它们,但我想这与我的问题无关。据我所知,问题似乎出在 .env 文件上,但我不明白我做错了什么?我正在访问 postgres 主机,它也是 运行 容器的名称,我不认为问题出在这里。

我可以通过以下方式从外部访问 postgres 容器 winpty docker exec -it postgres psql -U postgres -h postgres postgres

表格创建成功,必须是.env文件。 api 的控制台输出是:

Unable to connect to the database. Retrying (8)...

error: no PostgreSQL user name specified in startup packet

欢迎任何帮助!提前致谢! PS: 我在 Whosebug 中找到了类似的主题,但似乎没有解决我的问题。如果我有任何机会错过了一个已经回答的主题,请指出它。

将 postgres 的所有环境变量放入 .env 文件

POSTGRES_USER=postgres
POSTGRES_PASSWORD=postgres
POSTGRES_DB=postgres

然后告诉 docker-compose 使用 postgres 容器的 .env 文件解决了问题。