我在尝试为我的项目构建 Docker 映像时遇到问题,该项目使用旧版本的 Apollo 漫游器和 Node.js 14.20。尽管子图构建成功,但超级图在启动过程中因连接错误而失败。
这是我的 supergraph-config.yaml:
users:
routing_url: http://localhost:4000/graphql
schema:
subgraph_url: http://localhost:4000/graphql
projects:
routing_url: http://localhost:4002/graphql
schema:
subgraph_url: http://localhost:4002/graphql
datasets:
routing_url: http://localhost:4001/graphql
schema:
subgraph_url: http://localhost:4001/graphql
Dockerfile 是
FROM node:14.21.3-bullseye
WORKDIR /app
ADD package.json .
RUN npm cache clean --force
RUN npm install
RUN npm i @apollo/rover
ADD . .
CMD ["npm", "run", "start:update-graph"]
package.json中的start:update-graph命令定义如下:
rover supergraph compose --config ./supergraph-config.yaml > supergraph.graphql && node -r esm index.js
运行时,我收到以下错误,指示连接到子图 URL 时出现问题:
2024-11-25 13:00:23 > rover supergraph compose --config ./supergraph-config.yaml > supergraph.graphql && node -r esm index.js
2024-11-25 13:00:23
2024-11-25 13:00:23 error[E038]: Encountered 3 build errors while trying to build a supergraph.
2024-11-25 13:00:23
2024-11-25 13:00:23 Caused by:
2024-11-25 13:00:23 E028: error sending request for url (http://localhost:4000/graphql) while resolving the schema for the 'datasets' subgraph
2024-11-25 13:00:23 Make sure the endpoint is accepting connections and is spelled correctly
2024-11-25 13:00:23 E028: error sending request for url (http://localhost:4002/graphql) while resolving the schema for the 'projects' subgraph
2024-11-25 13:00:23 Make sure the endpoint is accepting connections and is spelled correctly
2024-11-25 13:00:23 E028: error sending request for url (http://localhost:4001/graphql) while resolving the schema for the 'users' subgraph
2024-11-25 13:00:23 Make sure the endpoint is accepting connections and is spelled correctly
2024-11-25 13:00:23
在 Docker 外部访问时,可以在
http://localhost:4000/graphql
、http://localhost:4001/graphql
和 http://localhost:4002/graphql
上访问子图,但超级图设置无法识别 Docker 内的这些端点。
有没有人遇到过类似的问题,或者可以提供有关在 Docker 中超级图组合期间可能导致这些连接错误的原因的见解?
可能值得指出什么是 localhost,当您连接到 localhost 时,您实际上是在连接到您自己。
您的项目 Docker 容器可能正在使用默认的桥接 docker 网络,因此它与容器本身是隔离的网络。因此,如果您的项目容器尝试连接到
http://localhost:400x/graphql
,这意味着它尝试在容器本身上找到此服务,并且根据您在问题中输入的内容,似乎那里没有运行此类服务。
如何运行 http://localhost:400x/graphql 服务?它是同一主机上的另一个容器吗?如果它是另一个容器,那么最好的解决方案是将两个容器放在同一个 docker 网络中,然后您的项目 docker 容器应该能够使用其名称(如
http://containername:4000/graphql
)连接到它,但不能使用 localhost!
附加且最简单的选项是在主机网络中运行项目容器,在这种情况下它将使用您的主机网络接口,在这种情况下它很可能能够连接到
http://localhost:400x/graphql
。请记住,这可能不是一个理想的解决方案,因为它会暴露容器的所有端口,并且对 docker 工作原理了解有限的人可能不应该使用它。