访问docker容器';来自静态客户端的IP地址

访问docker容器';来自静态客户端的IP地址,docker,docker-compose,dockerfile,apollo-client,hasura,Docker,Docker Compose,Dockerfile,Apollo Client,Hasura,我有一个静态Gatsby应用程序,它需要来自另一个容器的uri来实现Hasura GraphQL连接 问题 Gatsby容器在Hasura之前完成docker构建,因此Gatsby中的URI设置为undefined 我怎样才能使uri是动态的,并在构建完成后更改Hasura的实际容器IP地址 我试过的 在docker compose.yml中添加一个dependens_,强制Gatsby等待Hasura容器准备就绪,这样在Gatsby容器开始构建时它就拥有了IP。但根据[0]的说法,这并不能保

我有一个静态Gatsby应用程序,它需要来自另一个容器的uri来实现Hasura GraphQL连接

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

我怎样才能使uri是动态的,并在构建完成后更改Hasura的实际容器IP地址

我试过的
  • 在docker compose.yml中添加一个
    dependens_
    ,强制Gatsby等待Hasura容器准备就绪,这样在Gatsby容器开始构建时它就拥有了IP。但根据[0]的说法,这并不能保证盖茨比会等到哈苏拉完成后再开始
  • 它建议添加一个自定义bash脚本来强制Gatsby容器等待。如果使用
    wait.sh
    ,子命令应该是什么(等待完成后的命令)
[0]

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,
});

找到了解决办法

我错误地考虑了集装箱网络关系

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

解释
  • Hasura容器通过
    localhost:8180
    向所有人公开自己。如果查看docker compose文件,port
    8180:8080
    表示“使Hasura的端口8080可供localhost的端口8180访问”
  • gatsby应用程序(nginx-webserver)应该指向
    localhost:8180
    ,而不是
    hasura:8080
我的最终docker-compose.yml:

版本:“3.6”
服务:
数据库:
图片:博士后:12.2
容器名称:“postgres db”
环境文件:
-database.env
卷数:
-./schema.sql:/docker-entrypoint-initdb.d/1-schema.sql
-./seed.sql:/docker-entrypoint-initdb.d/2-seed.sql
哈苏拉:
图:hasura/graphql引擎:v1.2.1
重新启动:失败时
容器名称:“hasura”
取决于:
-数据库
端口:
- '8180:8080'
环境文件:
-哈苏拉环境酒店
网状物:
构建:'.'
图像:“nginx web服务器”
容器名称:“web”
重新启动:失败时
端口:
- '8080:80'
卷数:
-.:/app
-应用程序/节点单元
环境文件:
-webserver.env
客户端设置:

从“apollo boost”导入apollo客户端;
从“同构提取”导入提取;
导出常量HASURA\u ENDPOINT\u URI=
process.env.NODE_env==“开发”
? 'http://localhost:8090/v1/graphql'
: 'http://localhost:8180/v1/graphql';
export const client=新客户端({
uri:HASURA___uri,
取来
});
找到了解决方案

我错误地考虑了集装箱网络关系

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

解释
  • Hasura容器通过
    localhost:8180
    向所有人公开自己。如果查看docker compose文件,port
    8180:8080
    表示“使Hasura的端口8080可供localhost的端口8180访问”
  • gatsby应用程序(nginx-webserver)应该指向
    localhost:8180
    ,而不是
    hasura:8080
我的最终docker-compose.yml:

版本:“3.6”
服务:
数据库:
图片:博士后:12.2
容器名称:“postgres db”
环境文件:
-database.env
卷数:
-./schema.sql:/docker-entrypoint-initdb.d/1-schema.sql
-./seed.sql:/docker-entrypoint-initdb.d/2-seed.sql
哈苏拉:
图:hasura/graphql引擎:v1.2.1
重新启动:失败时
容器名称:“hasura”
取决于:
-数据库
端口:
- '8180:8080'
环境文件:
-哈苏拉环境酒店
网状物:
构建:'.'
图像:“nginx web服务器”
容器名称:“web”
重新启动:失败时
端口:
- '8080:80'
卷数:
-.:/app
-应用程序/节点单元
环境文件:
-webserver.env
客户端设置:

从“apollo boost”导入apollo客户端;
从“同构提取”导入提取;
导出常量HASURA\u ENDPOINT\u URI=
process.env.NODE_env==“开发”
? 'http://localhost:8090/v1/graphql'
: 'http://localhost:8180/v1/graphql';
export const client=新客户端({
uri:HASURA___uri,
取来
});

我不明白的是,如果您可以使用
容器名称
,为什么您需要一个IP地址,因为所有容器都自动位于同一个网络上。对不起,这就是我说的IP:)时的意思。我将容器名
hasura
放入
webserver.env
文件(
http://hasura:8080/v1/graphql
),但仍会在应用程序中返回未定义。我认为这是因为应用程序容器在另一个容器之前完成。不,文件
/etc/hosts
应该自动更新,一旦另一个容器启动,它应该正常解析。我怀疑问题出在其他地方,可能是哈苏拉(hasura)立即上下波动,使其处于持续重新启动状态?我不明白的是,如果您可以使用
容器名称
,它将自动解析为容器内
/etc/hosts
的IP地址,为什么您需要IP地址,因为所有容器都自动在同一个网络上。对不起,这就是我说的IP:)的意思。我将容器名
hasura
放入
webserver.env
文件(
http://hasura:8080/v1/graphql
),但仍会在应用程序中返回未定义。我想是因为