Docker Prisma 错误 P1001:无法访问 `postgres` 处的数据库服务器:`5432`

Maj*_*tte 5 postgresql node.js express docker prisma

经过几个小时的搜索,我必须鞠躬并向您询问有关我的问题的一些建议:

我的后端(express + prisma + postgresql)是 Dockerized 的,可以正常运行,但我无法使用npx prismawsl2 zsh 终端中的命令。

这是我的 .env

# Database settings
NODE_ENV=dev
DB_USER=user
DB_PASS=password
DATABASE_URL="postgresql://${DB_USER}:${DB_PASS}@postgres/chimere?schema=public"
Run Code Online (Sandbox Code Playgroud)

Dockerfile:

FROM node:17-alpine3.14 as base

WORKDIR /user/src/app
COPY package*.json /user/src/app/
EXPOSE 5000

FROM base as dev
ENV NODE_ENV=development
RUN npm install -g nodemon && npm install
COPY . /user/src/app/
RUN npx prisma generate
CMD ["nodemon", "src/index.js"]

FROM base as production
ENV NODE_ENV=production
RUN npm ci
COPY . /user/src/app/
RUN npx prisma generate
CMD ["node", "src/index.js"]
Run Code Online (Sandbox Code Playgroud)

docker-compose.yml :

version: '3.8'
services:
  postgres:
    image: postgres
    restart: always
    environment:
      - POSTGRES_USER=${DB_USER}
      - POSTGRES_PASSWORD=${DB_PASS}
    volumes:
      - postgres:/var/lib/postgresql/data
    ports:
      - '5432:5432'
  web:
      build:
        context: ./
        target: dev
      restart: always
      volumes:
        - .:/usr/src/app
        - uploaded-files:/usr/src/app/public/media/files
        - uploaded-pictures:/usr/src/app/public/media/pictures
      command: npm run start:dev
      ports:
        - "5000:5000"
      environment:
        NODE_ENV: development
        DEBUG: nodejs-docker-express:*

volumes:
    postgres:
    uploaded-files:
    uploaded-pictures:
Run Code Online (Sandbox Code Playgroud)

和 Prisma 架构:

generator client {
    provider      = "prisma-client-js"
    binaryTargets = ["native", "linux-musl"]
}

datasource db {
    provider = "postgresql"
    url      = env("DATABASE_URL")
}
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,我对 Docker 还很陌生,几乎所有东西都是来自 Google 的经过调整的 copypasta(:

如何让我的应用程序正常工作并让我的命令也正常工作?

谢谢 !

小智 10

我遇到了同样的问题,但它是在一个mysql容器上。DATABASE_URL基本上我的文件中有问题.env。它看起来像这样:

DATABASE_URL="mysql://${DB_USER}:${DB_PASS}@localhost:3306/project_name"
Run Code Online (Sandbox Code Playgroud)

问题是localhost。显然,当在容器内运行时,localhost它使用容器的名称而不是。我更改了 docker compose 以指定容器的名称:

DATABASE_URL="mysql://${DB_USER}:${DB_PASS}@localhost:3306/project_name"
Run Code Online (Sandbox Code Playgroud)

注意container_name属性。之后,我将其更改.env为:

DATABASE_URL="mysql://${DB_USER}:${DB_PASS}@mysql:3306/project_name"
Run Code Online (Sandbox Code Playgroud)

我建议你尝试类似的事情。也许是这样的:

version: '3.1'

services:

  db:
    image: mysql
    container_name: mysql
    ports:
      - 3306:3306
Run Code Online (Sandbox Code Playgroud)

对于您来说,.env您可以保持现在的方式,除非您选择了不同的容器名称,然后您将用您在大括号内选择的名称进行替换(请记住删除大括号):

DATABASE_URL="postgresql://${DB_USER}:${DB_PASS}@{container_name}/chimere?schema=public"
Run Code Online (Sandbox Code Playgroud)

另请查看此 GitHub 问题以获取更多信息: https ://github.com/prisma/prisma/issues/1385