如何使用docker compose将在一个容器内运行的Prisma ORM连接到另一个容器中的PostgreSQL数据



描述

我使用node.jsPrisma作为ORM构建了一个简单的RestAPI,并为该应用程序创建了一个Dockerfile,然后我使用docker-compose来制作这些服务:-

  • web->这是使用上述Dockerfile构建的应用程序服务
  • pgdb->使用postgresql官方docker镜像构建的postgresql容器

问题

当我尝试运行docker-compose up时,无法构建web服务,因为Prisma无法运行它的迁移,因为它无法连接到另一个服务中运行的数据库,即pgdb

特定错误消息

错误:P1001:无法访问pgdb:5432上的数据库服务器
请确保您的数据库服务器在pgdb:5432上运行。

注意:我在这里使用了pgdb(PostgreSQL服务的名称(来引用主机

预期行为

它应该能够使用pgdb作为主机参考,并成功连接到位于pgdb:5432的数据库服务器

代码

  • docker-compose内部引用的Dockerfile,用于创建web服务

    FROM node:16
    WORKDIR /app
    COPY package*.json .
    RUN npm install
    COPY . .
    # Run Prisma migrations.
    RUN npx prisma migrate dev --name init
    # Compile typescript code to javascript.
    RUN npx tsc
    # Run the compiled code (compiled files are outputed to `dist` folder).
    CMD [ "node", "dist/index.js" ]
    
  • docker-compose.yml

    version: "3.9"
    services:
    webapp:
    build: .
    ports:
    - "5000:5000"
    depends_on:
    - pgdb
    pgdb:
    image: postgres:14
    environment:
    - POSTGRES_USER=postgres
    - POSTGRES_PASSWORD=postgres
    - POSTGRES_DB=mydb
    
  • .env(包含Prisma DB连接字符串(

    DATABASE_URL="postgresql://postgres:postgres@pgdb:5432/mydb?schema=public"
    

版本

  • 节点v16.17.0
  • 棱镜^4.4.0
# Run Prisma migrations.
RUN npx prisma migrate dev --name init

在docker镜像构建时运行迁移是没有意义的。迁移应该在映像的入口点内运行,而不是在构建映像时运行。

然后,当部署容器时,迁移会在部署容器的每个环境中启动应用程序之前运行。

最新更新