描述
我使用node.js和Prisma作为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镜像构建时运行迁移是没有意义的。迁移应该在映像的入口点内运行,而不是在构建映像时运行。
然后,当部署容器时,迁移会在部署容器的每个环境中启动应用程序之前运行。