访问docker容器';来自静态客户端的IP地址
我有一个静态Gatsby应用程序,它需要来自另一个容器的uri来实现Hasura GraphQL连接 问题 Gatsby容器在Hasura之前完成docker构建,因此Gatsby中的URI设置为访问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]的说法,这并不能保
undefined
我怎样才能使uri是动态的,并在构建完成后更改Hasura的实际容器IP地址
我试过的
- 在docker compose.yml中添加一个
,强制Gatsby等待Hasura容器准备就绪,这样在Gatsby容器开始构建时它就拥有了IP。但根据[0]的说法,这并不能保证盖茨比会等到哈苏拉完成后再开始dependens_
- 它建议添加一个自定义bash脚本来强制Gatsby容器等待。如果使用
,子命令应该是什么(等待完成后的命令)wait.sh
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容器通过
向所有人公开自己。如果查看docker compose文件,portlocalhost:8180
表示“使Hasura的端口8080可供localhost的端口8180访问”8180:8080
- gatsby应用程序(nginx-webserver)应该指向
,而不是localhost:8180
hasura:8080
版本:“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容器通过
向所有人公开自己。如果查看docker compose文件,portlocalhost:8180
表示“使Hasura的端口8080可供localhost的端口8180访问”8180:8080
- gatsby应用程序(nginx-webserver)应该指向
,而不是localhost:8180
hasura:8080
版本:“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
),但仍会在应用程序中返回未定义。我想是因为