程序问答   发布时间:2022-06-01  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了Docker 中的 NestJS 无法在另一个 Docker 容器中的 Postgres 上执行 Prisma Migrate大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决Docker 中的 nestJS 无法在另一个 Docker 容器中的 @R_675_6927@es 上执行 Prisma Migrate?

开发过程中遇到Docker 中的 nestJS 无法在另一个 Docker 容器中的 @R_675_6927@es 上执行 Prisma Migrate的问题如何解决?下面主要结合日常开发的经验,给出你关于Docker 中的 nestJS 无法在另一个 Docker 容器中的 @R_675_6927@es 上执行 Prisma Migrate的解决方法建议,希望对你解决Docker 中的 nestJS 无法在另一个 Docker 容器中的 @R_675_6927@es 上执行 Prisma Migrate有所启发或帮助;

我在为 nestJs 应用程序创建 Docker 映像时遇到问题,该应用程序通过 prisma 与已在另一个容器中运行的 @R_675_6927@ess 数据库通信。 问题是在 Docker Build 的“prisma generate”阶段无法访问数据库。

那是简短的版本。 :-)

docker-compose 数据库

首先,在'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

API 的 docker-compose

还有另一个构建 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

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,请注明来意。