连接Docker容器:在同一台主机上通过Docker Compose将前端连接到GraphQL后端
假设我在docker-compose上运行2个容器/服务的主机上:
- 后端graphql(端口:8000:8000)
- 前端反应(端口:8081:8081)
在我的react + apollo代码所在的前端容器中,我需要设置这个const:
// frontend container code export const APOLLO = { uri: 'http://0.0.0.0:8000/graphql' // << not working, what to use here? };
但是,uri值无法成功连接到后端graphql端点。 我收到错误,如Error Network error: request to http://0.0.0.0:8000/graphql failed, reason: connect ECONNREFUSED 0.0.0.0:8000
容器可以自行工作。 我可以导航到http://0.0.0.0:8000
与他们分别进行交互。 我也可以input每个容器,并通过他们的服务名称空间与ping backend
或ping frontend
到达另一个。
但是,当我在我的代码中做uri: 'http://backend:8000/graphql'
或uri: 'http://backend/graphql'
时,我得到了错误Error Network error: only absolute urls are supported
。
在docker inspect backend
,我得到的后端容器的IP地址为: '172.18.0.5'
。 我试图插入uri作为uri: 'http://172.18.0.5/graphql'
,但我得到Error Network error: Network request failed with status 403 - "Forbidden"
在给定这些场景的代码中,我应该如何将后端docker容器连接到前端?
谢谢!
通过在本地运行服务器而不是Docker来修复它,并发现后端由于未设置CORS头部而拒绝前端条目。 白名单前端的IP,它的工作。 在Docker容器中用后端ip http://172.18.0.5/graphql
再次testing,连接是完美的。
希望这可以帮助!
编辑 :引用在url主机名称的容器名称,即http://backend/graphql
也工作得益于泊坞窗networking桥接设置由docker撰写。 这是比硬编码上面的docker集装箱IP更好的解决scheme。
这是节点获取无法访问协议或主机名时发生的问题
if (!parsedURL.protocol || !parsedURL.hostname) { throw new TypeError('Only absolute URLs are supported'); }
根据您的graphql后端进程查询的方式,最好注销每个服务端点的URL,并确保URL包含主机AND协议,否则获取将失败。
对于我自己,当我的主机variables从我的服务端点的ENV回到undefined
时,发生了错误。