用另一层 node express 镜像扩展 prisma Docker 镜像

Posted

技术标签:

【中文标题】用另一层 node express 镜像扩展 prisma Docker 镜像【英文标题】:Extend prisma Docker image with another layer of node express image 【发布时间】:2020-07-02 06:14:23 【问题描述】:

我从 dockerhub 获得了一个 prisma 服务器映像,它是

prismagraphql/prisma:1.34

为了在端口 4466 上运行,上面的 prisma 映像需要数据库连接字符串,并且使用如下所示的 docker-compose 文件将其作为环境变量传递

prisma:
   image: prismagraphql/prisma:1.34   
   ports:
     - "4466:4466"     
   environment:
     PRISMA_CONFIG: |
       port: 4466
       databases:
         default:
           connector: mongo
           uri: mongodb://mongodb   

我正在尝试扩展上述 prisma 服务器映像,如下所示。

FROM prismagraphql/prisma:1.34

RUN apk add  --no-cache --repository http://dl-cdn.alpinelinux.org/alpine/v3.7/main/ nodejs=8.9.3-r1

WORKDIR /project

COPY . .

# To handle 'not get uid/gid' error in alpine linux set unsafe-perm true
RUN apk update && apk upgrade \
    && npm config set unsafe-perm true \
    && npm install --g yarn \
    && npm install -g prisma \
    && yarn install \
    && chmod +x ./entrypoint.sh \
    && chmod +x ./wait-for-it.sh

EXPOSE 4466 4000

ENTRYPOINT ["./entrypoint.sh"]

entrypoint.sh文件是这样的

#!/bin/bash

# wait for the prisma service to start.
# then run prisma deploy (more on that later)
./wait-for-it.sh prisma:4466 -- prisma deploy

# go into the project...
cd /project

# run an npm command to use nodemon to start/watch the server
npm run start

在上面的 Dockerfile 中

我尝试在来自 dockerhub 的现有 prisma 映像上安装 nodejs 应用程序。

此 nodejs 应用程序称为 prisma nexus。 nexus 需要连接到 prisma on localhost:4466 和 nexus 在端口 4000 上运行。

当我运行下面的图片时,我收到了这个错误。即 nexus(nodejs app) 无法连接到 prisma

Could not connect to server at http://localhost:4466. Please check if your server is running.

最后我像这样运行扩展图像


 mongodb:
   image: mongo:4.2
   container_name: mongodb
   volumes:
     - ./mongo-volume:/data/db
   ports:
     - "27017:27017"
   networks:
     - prisma

  prisma:
   image: extended-image-here:1.0
   container_name: prisma-server
   restart: always
   ports:
     - "4466:4466"
     - "4000:4000"
   environment:
     PRISMA_CONFIG: |
       port: 4466
       databases:
         default:
           connector: mongo
           uri: mongodb://mongodb

我在这里做什么?请帮忙。

【问题讨论】:

如何运行扩展图像? 使用 docker-compose.. 我已经更新了关于如何运行扩展图像的问题 您是否尝试仅使用 prisma 映像运行 nexus nodejs 应用程序?我的意思是在本地运行 nodejs 应用程序(而不是在容器中) 是的,我尝试在容器中运行 nodejs 应用程序。我使用了 ENTRYPOINT ["./entrypoint.sh"]。更新了 entrypoint.sh 的代码。 entrypoint.sh 调用另一个脚本 ./wait-for-it.sh 检查 prisma 是否在端口:4466 上准备就绪,并在容器中启动 nodejs 应用程序 ./wait-for-it.sh的内容是什么 【参考方案1】:

我猜它不起作用的原因是因为图像 prismagraphql/prisma:1.34 有一个入口点,并且在 Dockerfile 的末尾还有另一个入口点。 Docker 只接受 Dockerfile 中的单个入口点...

【讨论】:

【参考方案2】:

首先:在您的代码中,您将 MongoDB 容器放在名为 prisma 的特定命名网络上,但您不会对 prisma 容器做同样的事情。使用 compose 时,同一覆盖网络上的容器按名称解析,但请求只会在容器之间路由,如果它们位于同一网络上。

下一步:您不应该在同一个容器中运行两台服务器。最好不要在 prisma 映像之上构建您的应用程序,而是在 alpine 或 ubuntu(或其他任何东西)之上构建它。它应该连接到另一个运行 prisma 服务器的容器。在 cmets 你说你真的想这样做,但你真的不应该这样做。在客户端的服务器而不是单个容器上运行 compose 配置并不难,但在单个容器中运行 2 个服务器要困难得多。

最后:本地主机引用(你说的是关系?)应该以某种方式配置。找出方法,并让它解决类似“http://prisma:4466”的问题。这样,您将拥有 3 个容器——mongodb、prisma 和您自己的应用程序。

【讨论】:

以上是关于用另一层 node express 镜像扩展 prisma Docker 镜像的主要内容,如果未能解决你的问题,请参考以下文章

Power Query / Power BI - 用另一列中的值替换空值

Docker快速搭建Node.js Express运行环境

Docker快速搭建Node.js Express运行环境

Docker快速搭建Node.js Express运行环境

Docker快速搭建Node.js Express运行环境

express系列Express 基础(未完成)