【发布时间】:2021-06-11 09:41:54
【问题描述】:
我在为通过 Prisma 与已在另一个容器中运行的 Postgress 数据库通信的 NestJS 应用程序创建 Docker 映像时遇到问题。 问题是在 Docker Build 的“prisma generate”阶段无法访问数据库。
这是简短的版本。 :-)
docker-compose 数据库
首先,数据库的 docker-compose 在 'docker-compose up -d' 之后运行良好:
version: '3.9'
services:
db:
image: postgres:latest
restart: "no"
container_name: hwpostgres
volumes:
- ./database:/var/lib/postgresql/data
ports:
- "5432:5432"
environment:
POSTGRES_PASSWORD: root
POSTGRES_USER: root
POSTGRES_DB: taskDb
networks:
default:
external:
name: my-network
docker-compose 的 API
还有另一个构建 NestJS API 应用程序的 docker-compose 文件:
ersion: '3.9'
services:
api:
build:
context: ./build
dockerfile: Dockerfile_api
image: hwapi
restart: "no"
container_name: hwapi
environment:
DATABASE_URL: postgresql://root:root@hwpostgres:5432/tasksDb?schema=public
ports:
- "8080:3001"
command: ["node", "dist/main.js"]
networks:
default:
external:
name: cops-net
Dockerfile_api
Dockerfile_api 如下所示:
FROM node:latest As development
ARG DATABASE_URL=postgresql://root:root@hwpostgres:5432/tasksDb?schema=public
ENV DATABASE_URL $DATABASE_URL
WORKDIR /usr/src/app
COPY . .
RUN npm install -g npm@7.6.3
RUN npm install
RUN npx prisma migrate dev --name init --preview-feature
RUN npm run build
这里显示的这个 Dockerfile_api 显然是多部分 Dockerfile 的第一阶段,但第二部分对于这个问题描述并不感兴趣。
问题是“npx prisma migrate”命令失败,因为它找不到数据库。 构建过程该部分的输出:
Step 8/9 : RUN npx prisma migrate dev --name init --preview-feature
---> Running in 938d6538806a
Environment variables loaded from .env
Prisma schema loaded from prisma/schema.prisma
Datasource "db": PostgreSQL database "tasksDb", schema "public" at "hwpostgres:5432"
Error: P1001: Can't reach database server at `hwpostgres`:`5432`
Please make sure your database server is running at `hwpostgres`:`5432`.
所以,它说数据库有问题
同样的事情交互
当我将 Dockerfile_api 更改为以下内容时:
FROM node:latest As development
ARG DATABASE_URL=postgresql://root:root@hwpostgres:5432/tasksDb?schema=public
ENV DATABASE_URL $DATABASE_URL
WORKDIR /usr/src/app
COPY . .
RUN npm install -g npm@7.6.3
RUN npm install
# RUN npx prisma migrate dev --name init --preview-feature
# RUN npm run build
并将该 Dockerfile 的 docker-compose.yml 中的命令更改为
command: ["sleep", "3650d"]
然后容器在构建完成后继续运行。
然后我进入创建的 Docker 容器(docker exec -it hwapi /bin/bash), 然后执行“npm prisma migrate”命令,一切正常!!
输出:
/usr/src/app# echo $DATABASE_URL
postgresql://root:root@hwpostgres:5432/tasksDb?schema=public
/usr/src/app# npx prisma migrate dev --name init --preview-feature
Environment variables loaded from .env
Prisma schema loaded from prisma/schema.prisma
Datasource "db": PostgreSQL database "tasksDb", schema "public" at "hwpostgres:5432"
Already in sync, no schema change or pending migration was found.
/usr/src/app#
所以,这里看起来可以找到运行数据库的Container。
为什么在Build阶段找不到数据库,而我在同一个Container的交互式版本中进行Prisma Migrate时却可以找到数据库?
【问题讨论】:
-
您能否尝试将服务保存在单个撰写文件中,如 here 所示,然后检查?
标签: postgresql docker docker-compose nestjs prisma