我有一个静态的Gatsby应用程序,需要另一个容器中的uri进行Hasura GraphQL连接。
Gatsby容器在Hasura之前完成了docker构建,因此Gatsby中的URI设置为undefined
。
如何使它具有动态性,并在完成构建后更改Hasura的实际容器IP地址?
depends_on
中添加一个docker-compose.yml
,以强制Gatsby等待Hasura容器准备好,因此,在Gatsby容器开始构建之前,它将具有IP。但是根据[0],它不能保证盖茨比会等到Hasura完成自我启动之后。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,
});
答案 0 :(得分:0)
找到了解决方案。
我在错误地考虑容器网络关系。
客户端在连接时会查看主机的IP地址,而不是容器的IP地址。
localhost:8180
向所有人公开。如果您查看docker-compose文件,则端口8180:8080
意味着“使Hasura的端口8080可访问本地主机的端口8180”。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
});