从静态客户端访问Docker容器的IP地址

时间:2020-06-06 03:46:27

标签: docker docker-compose dockerfile apollo-client hasura

我有一个静态的Gatsby应用程序,需要另一个容器中的uri进行Hasura GraphQL连接。

问题

Gatsby容器在Hasura之前完成了docker构建,因此Gatsby中的URI设置为undefined

如何使它具有动态性,并在完成构建后更改Hasura的实际容器IP地址?

我尝试过的

  • depends_on中添加一个docker-compose.yml,以强制Gatsby等待Hasura容器准备好,因此,在Gatsby容器开始构建之前,它将具有IP。但是根据[0],它不能保证盖茨比会等到Hasura完成自我启动之后。
  • 建议添加自定义bash脚本以强制Gatsby容器等待。如果我要使用wait-for-it.sh,那么子命令应该是什么(等待完成后的命令)?

[0] https://docs.docker.com/compose/startup-order/

docker-compose.yml

version: '3.6'

services:
  database:
    image: postgres:12.2
    container_name: 'postgres-db'
    env_file:
      - database.env
    volumes:
      - ./schema.sql:/docker-entrypoint-initdb.d/1-schema.sql
      - ./seed.sql:/docker-entrypoint-initdb.d/2-seed.sql

  hasura:
    image: hasura/graphql-engine:v1.2.1
    restart: on-failure
    container_name: 'hasura'
    depends_on:
      - database
    ports:
      - '8180:8080'
    env_file:
      - hasura.env

  web:
    build: '.'
    image: 'webserver'
    container_name: 'nginx-webserver'
    restart: on-failure
    depends_on:
      - hasura
    ports:
      - '8080:80'
    volumes:
      - /app/node_modules
      - .:/app
    env_file:
      - webserver.env

webserver.env文件

NODE_ENV=production
GATSBY_WEBPACK_PUBLICPATH=/
HASURA_ENDPOINT=http://hasura:8080/v1/graphql

需要Hasura URI的GraphQL Apollo客户端:

export const client = new ApolloClient({
  uri: process.env.HASURA_ENDPOINT,
  fetch,
});

1 个答案:

答案 0 :(得分:0)

找到了解决方案。

我在错误地考虑容器网络关系。

客户端在连接时会查看主机的IP地址,而不是容器的IP地址。

说明

  • Hasura容器通过localhost:8180向所有人公开。如果您查看docker-compose文件,则端口8180:8080意味着“使Hasura的端口8080可访问本地主机的端口8180”。
  • gatsby应用程序(nginx-webserver)应该指向localhost:8180,而不是hasura:8080

我最后的docker-compose.yml:

version: '3.6'

    services:
      database:
        image: postgres:12.2
        container_name: 'postgres-db'
        env_file:
          - database.env
        volumes:
          - ./schema.sql:/docker-entrypoint-initdb.d/1-schema.sql
          - ./seed.sql:/docker-entrypoint-initdb.d/2-seed.sql
    
      hasura:
        image: hasura/graphql-engine:v1.2.1
        restart: on-failure
        container_name: 'hasura'
        depends_on:
          - database
        ports:
          - '8180:8080'
        env_file:
          - hasura.env
    
      web:
        build: '.'
        image: 'nginx-webserver'
        container_name: 'web'
        restart: on-failure
        ports:
          - '8080:80'
        volumes:
          - .:/app
          - app/node_modules
        env_file:
          - webserver.env

ApolloClient设置:

import ApolloClient from 'apollo-boost';
import fetch from 'isomorphic-fetch';

export const HASURA_ENDPOINT_URI =
  process.env.NODE_ENV === 'development'
    ? 'http://localhost:8090/v1/graphql'
    : 'http://localhost:8180/v1/graphql';

export const client = new ApolloClient({
  uri: HASURA_ENDPOINT_URI,
  fetch
});