如何在 docker 容器中连接 graphql 和 prisma?

Posted

技术标签:

【中文标题】如何在 docker 容器中连接 graphql 和 prisma?【英文标题】:How to connect graphql and prisma in docker containers? 【发布时间】:2019-11-22 19:29:56 【问题描述】:

我正在尝试构建一个 docker-compose 文件,该文件运行一个使用 prisma 和 mongodb 的 node.js graphql api。 但是我收到一个错误request to http://localhost:4466/ failed, reason: connect ECONNREFUSED 127.0.0.1:4466 当我尝试从 graphql 游乐场发送请求时,当我运行 prisma deploy 或只是尝试时同样的错误从 graphql 容器内 ping http:localhost:4466。

我尝试使用默认网络并创建新网络,但我遇到了同样的错误。 我曾尝试在版本 3 中使用链接(已弃用),但我也遇到了同样的错误。

P.S 我可以在浏览器中正常打开 prisma 的 Playground,链接:http://localhost:4466

这是我的 docker-compose 文件:

version: '3'
services:
  web:
    build: .
    networks: 
      net:
    ports:
    - "80:4000"
    command: wait-for-it/wait-for-it.sh http://localhost:4466 -t 30 -- ./run.sh
  prisma:
    image: prismagraphql/prisma:1.34
    restart: always
    networks: 
      net:
    ports:
    - "4466:4466"
    environment:
      PRISMA_CONFIG: |
        port: 4466
        # uncomment the next line and provide the env var PRISMA_MANAGEMENT_API_SECRET=my-secret to activate cluster security
        # managementApiSecret: my-secret
        databases:
          default:
            connector: mongo
            uri: mongodb://prisma:prisma@mongo
    command: /bin/sh.sh
  mongo:
    image: mongo:3.6
    restart: always
    networks: 
      net:
    environment:
      MONGO_INITDB_ROOT_USERNAME: prisma
      MONGO_INITDB_ROOT_PASSWORD: prisma
    ports:
      - "27017:27017"
    volumes:
      - mongo:/var/lib/mongo
volumes:
  mongo:
networks: 
      net:

这是 web 服务的 dockerfile:

FROM node:10

WORKDIR /app

COPY . /app/

RUN yarn install --pure-lockfile 

RUN yarn global add prisma

这是 run.sh 文件:

echo "prisma deploy command "
prisma deploy
echo "get-schema command"
yarn run get-schema
echo "starting command"
yarn run start 

有什么我误解的地方,或者我需要解决什么问题才能使其正常工作?

【问题讨论】:

【参考方案1】:

您应该使用http://prisma:4466 作为您的网络容器中的连接 URL。由于您的容器将连接到同一网络,因此容器的名称将是 DNS 名称,因此将解析为具体容器的 IP。

【讨论】:

【参考方案2】:

您的 Node 应用程序中的 localhost 指向运行 Node 本身的容器,而不是您的主机。将http://localhost:4466 替换为http://prisma:4466http://<host-machine-local-ip>:4466

要在 Unix 机器上运行主机 IP:

hostname -i

或者

ifconfig | awk '/broadcast/ print $2' 

【讨论】:

【参考方案3】:

prisma.yml 的内容从

endpoint: http://localhost:4466
datamodel: datamodel.prisma

endpoint: http://192.168.99.100:4466
datamodel: datamodel.prisma

这对我有用。

【讨论】:

【参考方案4】:

通过键入 $docker-compose up -d 运行您的 docker 容器 -d 标志用于在分离模式下运行容器。

不要使用端点作为 http://localhost:4466 使用 http://127.0.1.1:4466 或者通过 cmd 检查您的本地主机:$localhost -i。 在 prisma-binding 中,您的构造函数的端点应为 http://127.0.1.1:4466

const prisma = new Prisma(
    typeDefs: './src/generated/prisma.graphql',
    endpoint: 'http://127.0.1.1:4466'
);

【讨论】:

以上是关于如何在 docker 容器中连接 graphql 和 prisma?的主要内容,如果未能解决你的问题,请参考以下文章

如何连接本地机器和 Docker 容器?

如何在搬运工中将两个 docker 容器相互连接

如何将两个NodeJS docker容器连接在一起?

如何将节点 docker 容器与 postgres docker 容器连接起来

如何在 OSX(boot2docker)上获得与 docker 容器的 ssh 连接

如何将两个 docker 容器与 nomad 连接