大佬教程收集整理的这篇文章主要介绍了Docker 中的 NestJS 无法在另一个 Docker 容器中的 Postgres 上执行 Prisma Migrate,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我在为 nestJs 应用程序创建 Docker 映像时遇到问题,该应用程序通过 prisma 与已在另一个容器中运行的 @R_675_6927@ess 数据库通信。 问题是在 Docker Build 的“prisma generate”阶段无法访问数据库。
那是简短的版本。 :-)
首先,在'docker-compose up -d'之后运行良好的数据库的docker-compose:
version: '3.9'
services:
db:
image: @R_675_6927@es:latest
restart: "no"
container_name: hw@R_675_6927@es
volumes:
- ./database:/var/lib/@R_675_6927@esql/data
ports:
- "5432:5432"
environment:
@R_675_6927@ES_password: root
@R_675_6927@ES_USER: root
@R_675_6927@ES_DB: taskDb
networks:
default:
external:
name: my-network
还有另一个构建 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: @R_675_6927@esql://root:root@hw@R_675_6927@es:5432/tasksDb?scheR_264_11845@a=public
ports:
- "8080:3001"
command: ["node","dist/main.Js"]
networks:
default:
external:
name: cops-net
Dockerfile_API 如下所示:
FROM node:latest As development
ARG DATABASE_URL=@R_675_6927@esql://root:root@hw@R_675_6927@es:5432/tasksDb?scheR_264_11845@a=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 的第一阶段,但第二部分对于这个问题描述并不有趣。
问题是'npxprisma migrate'命令失败,因为它找不到数据库。 构建过程该部分的输出:
Step 8/9 : RUN npx prisma migrate dev --name init --prevIEw-feature
---> Running in 938d6538806a
Environment variables loaded from .env
prisma scheR_264_11845@a loaded from prisma/scheR_264_11845@a.prisma
Datasource "db": @R_675_6927@esql database "tasksDb",scheR_264_11845@a "public" at "hw@R_675_6927@es:5432"
Error: P1001: Can't reach database server at `hw@R_675_6927@es`:`5432`
Please make sure your database server is running at `hw@R_675_6927@es`:`5432`.
所以,它说数据库有问题
当我将 Dockerfile_API 更改为以下内容时:
FROM node:latest As development
ARG DATABASE_URL=@R_675_6927@esql://root:root@hw@R_675_6927@es:5432/tasksDb?scheR_264_11845@a=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), 然后执行'npmprisma migrate'命令,一切正常!!
输出:
/usr/src/app# echo $DATABASE_URL
@R_675_6927@esql://root:root@hw@R_675_6927@es:5432/tasksDb?scheR_264_11845@a=public
/usr/src/app# npx prisma migrate dev --name init --prevIEw-feature
Environment variables loaded from .env
prisma scheR_264_11845@a loaded from prisma/scheR_264_11845@a.prisma
Datasource "db": @R_675_6927@esql database "tasksDb",scheR_264_11845@a "public" at "hw@R_675_6927@es:5432"
Already in sync,no scheR_264_11845@a change or pending migration was found.
/usr/src/app#
所以,这里看起来可以找到运行数据库的容器。
为什么在Build阶段找不到数据库,而我在同一个Container的交互版本中进行prisma Migrate时却可以找到数据库?
诀窍是,当您在 docker-compose 设置中运行 docker 容器时,您会在与数据库相同的 docker 网络中运行它。
当您运行 docker build
时,您与您的数据库不在同一个 docker 网络中,因此它找不到它。
就我个人而言,我建议不要将迁移步骤作为映像构建的一部分运行,而是将其作为容器启动过程的一部分运行 - 可能在自定义 ENTRYPOINT
脚本中。
如果您希望将迁移作为映像构建的一部分,您可以尝试运行 docker build --network=my-network
,其中 @H_985_11@my-network 是您将运行的数据库附加到的网络的名称。>
答案也是正确的,我只是想在我的情况下添加它,遇到同样的问题,我只需要将图像添加到主机网络,通过在 docker-compose.yml 文件中写入:>
network_mode: "host"
然后,我们可以连接到主机数据库,我们可以完成脚本的其余部分。所以,总而言之,如果您不想将 @R_675_6927@es 用作单独的映像,而是在主机 linux 机器中,那么您可以使用提供的代码。
以上是大佬教程为你收集整理的Docker 中的 NestJS 无法在另一个 Docker 容器中的 Postgres 上执行 Prisma Migrate全部内容,希望文章能够帮你解决Docker 中的 NestJS 无法在另一个 Docker 容器中的 Postgres 上执行 Prisma Migrate所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。