TLDR:> 我无法让邮递员成功查询在 docker 容器中运行的 gRPC 服务。
我有带有 gRPC 端点的 C#/dotnet 服务器。当我在本地运行服务器(也称为桌面 shell)时,我可以使用 postman 进行 gRPC 调用并成功获得预期响应。 (参见屏幕截图)
但是,当我尝试使用邮递员查询在 docker 容器中运行的同一服务器时,它失败并出现错误
Operation cancelled
。 (见截图)
我的 docker compose 文件是这样构建的:
version: '3.8'
name: boot_node
services:
boot-node:
container_name: boot-node
build:
context: .
dockerfile: boot_node.dockerfile
ports:
- "8080:8080"
- "50051:50051"
volumes:
- ./app:/app
networks:
- ironbar-network
networks:
ironbar-network:
driver: bridge
和我的 docker 文件
FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build-env
WORKDIR /node_dir
COPY ./src ./src
WORKDIR /node_dir/src
RUN dotnet restore
RUN dotnet publish -c Release -o /node_dir/bin
EXPOSE 443
EXPOSE 80
EXPOSE 50051
WORKDIR /node_dir/bin
ENTRYPOINT ["dotnet", "node.dll"]
看起来端口正常可用
d:\engineering\dotnet\ironbar\src\node>docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2ab951699288 boot_node-boot-node "dotnet node.dll" 23 minutes ago Up 6 seconds 80/tcp, 0.0.0.0:8080->8080/tcp, 443/tcp, 0.0.0.0:50051->50051/tcp boot-node
我已经尝试过:
我想我已经发布了所有相关内容。整个代码库可以在 github 上找到。
是否可以使用postman查询docker容器中运行的gRPC服务?如果是这样,我无法成功调用该服务是什么问题?
解决方案是更改我在 gRPC 端口上设置 Kestrel 侦听的方式。我需要监听 0.0.0.0(任何)而不是 localhost。
EG:
builder.WebHost.ConfigureKestrel(kestrelOptions =>
{
kestrelOptions.Listen(IPAddress.Any, configurationOptions.RPCPort, o => o.Protocols = HttpProtocols.Http2);
});