错误:P1001:无法访问位于“localhost”的数据库服务器:“5200”

Fur*_*sen 10 postgresql orm docker prisma

我使用的技术:

  • Nestjs -> 用于后端
  • 棱镜 -> 对于 orm
  • postgresql -> 数据库

我尝试使用 Docker 运行这些技术,但遇到了以下问题:

prisma schema loaded from prisma/schema.prism
Datasource "db": PostgreSQL database "nestjs", schema "public" at "localhost:5200"
Error: P1001: Can't reach database server at `localhost`:`5200`
Please make sure your database server is running at `localhost`:`5200`
Run Code Online (Sandbox Code Playgroud)

docker-compose.dev.yml

version: '3.7'
services:
  db:
    image: postgres:12.9
    ports:
      - 5200:5432
    environment:
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: 123
      POSTGRES_DB: nestjs
    volumes:
      - database-data:/var/lib/postgresql/data
    networks:
      - sai
    restart: always

  test:
    container_name: test
    image: test
    build:
      context: .
      target: development
      dockerfile: Dockerfile
    command: npm run start:prod
    ports:
      - 3000:3000
      - 9229:9229
    networks:
      - sai
    volumes:
      - .:/usr/src/app
      - /usr/src/app/node_modules
    links:
      - db
    depends_on:
      - db
    restart: always

networks:
  sai:
    driver: bridge

volumes:
  database-data:

Run Code Online (Sandbox Code Playgroud)

Nestjs 在端口 5200 上看不到我的 locahost 数据库。

Dockerfile 文件:

FROM node:latest as development
WORKDIR /usr/src/app
COPY package*.json ./
RUN npm install --only=development
COPY . .
RUN npm run build


FROM node:latest as production
ARG NODE_ENV=production
ENV NODE_ENV=${NODE_ENV}
WORKDIR /usr/src/app
COPY package*.json ./
RUN npm install --only=production
COPY . .
COPY --from=development /usr/src/app/prisma ./prisma
COPY --from=development /usr/src/app/dist ./dist
EXPOSE 3000
CMD npm run start:prod
Run Code Online (Sandbox Code Playgroud)

npm run start:prod 命令还对应于 package.json 文件中的以下内容:

...
  "generate:prisma": "npx prisma migrate dev --name init",
  "start:prod": "npm run generate:prisma && npm run dist/main",
...
Run Code Online (Sandbox Code Playgroud)

Han*_*ian 13

您需要使用 ,而不是localhost:5200用作数据库的地址db:5432

从主机连接时使用本地主机和映射的端口。您正在从桥接网络上的另一个容器进行连接,并且需要使用服务名称和容器正在侦听的端口。

  • 这对我不起作用。我也尝试做``db:5432``。我还尝试根据一些评论添加 ``?connect_timeout=300``` 。但他们都不适合我。有没有人解决这个问题 (3认同)
  • 我照你说的做了。这次我收到这样的错误:Error: P1001: Can'treach database server at `db`:`5200` (2认同)
  • 您需要使用端口 5432。而不是 5200。 (2认同)