从静态客户端访问 docker 容器的 IP 地址
Accessing a docker container's IP address from a static client
我有一个静态 Gatsby 应用程序,它需要来自另一个容器的 uri 来建立 Hasura GraphQL 连接。
问题
Gatsby 容器在 Hasura 之前完成 docker 构建,因此 Gatsby 中的 URI 设置为 undefined
。
我怎样才能使 uri 是动态的,并在构建完成后更改为 Hasura 的实际容器 IP 地址?
我试过的
- 在
docker-compose.yml
中添加 depends_on
以强制 Gatsby 等待 Hasura 容器准备就绪,因此在 Gatsby 容器开始构建时它将拥有 IP。但是根据[0],它不能保证 Gatsby 会等到 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,
});
找到解决方案。
我对容器网络关系的思考是错误的。
客户端在连接时查看HOST的IP地址,而不是容器的。
说明
- Hasura 容器通过
localhost:8180
向所有人公开。如果您查看 docker-compose 文件,端口 8180:8080
表示“使本地主机的端口 8180 可以访问 Hasura 的端口 8080”。
- 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
});
我有一个静态 Gatsby 应用程序,它需要来自另一个容器的 uri 来建立 Hasura GraphQL 连接。
问题
Gatsby 容器在 Hasura 之前完成 docker 构建,因此 Gatsby 中的 URI 设置为 undefined
。
我怎样才能使 uri 是动态的,并在构建完成后更改为 Hasura 的实际容器 IP 地址?
我试过的
- 在
docker-compose.yml
中添加depends_on
以强制 Gatsby 等待 Hasura 容器准备就绪,因此在 Gatsby 容器开始构建时它将拥有 IP。但是根据[0],它不能保证 Gatsby 会等到 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,
});
找到解决方案。
我对容器网络关系的思考是错误的。
客户端在连接时查看HOST的IP地址,而不是容器的。
说明
- Hasura 容器通过
localhost:8180
向所有人公开。如果您查看 docker-compose 文件,端口8180:8080
表示“使本地主机的端口 8180 可以访问 Hasura 的端口 8080”。 - 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
});