docker - 如何在 docker 容器中运行 .net core grpc?
问题描述
您好我已经使用 .Net 5 创建了 GRPC 项目。下面是我的 Docker 文件。
FROM mcr.microsoft.com/dotnet/aspnet:5.0-buster-slim AS base
WORKDIR /app
EXPOSE 80
EXPOSE 443
FROM mcr.microsoft.com/dotnet/sdk:5.0-buster-slim AS build
WORKDIR /src
COPY ./*.sln ./
COPY */*.csproj ./
RUN for file in $(ls *.csproj); do mkdir -p ${file%.*} && mv $file ${file%.*}; done
RUN dotnet restore
COPY . .
WORKDIR "/src/Geography"
RUN dotnet build "Geography.csproj" -c Release -o /app/build
FROM build AS publish
RUN dotnet publish "Geography.csproj" -c Release -o /app/publish
FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "Geography.dll"]
我尝试使用 Docker 在 Visual Studio 中运行解决方案,我看到容器已启动并正在运行。我看到下面暴露的端口。
0.0.0.0:32775->80/tcp, 0.0.0.0:32774->443/tcp
我创建了客户端应用程序并尝试点击如下 grpc 端点。
using var channel = GrpcChannel.ForAddress("http://localhost:32774");
var client = new Geographys.GeographysClient(channel);
在这里我得到以下错误
Status(StatusCode="Internal", Detail="Error starting gRPC call. HttpRequestException: 发送请求时出错。IOException: 无法从传输连接中读取数据: 现有连接被远程主机强行关闭.. SocketException : 现有连接被远程主机强行关闭。", DebugException="System.Net.Http.HttpRequestException: 发送请求时出错。---> System.IO.IOException: 无法从传输中读取数据连接:现有连接被远程主机强行关闭.. --->
有人可以帮助我了解这个问题的根本原因吗?任何帮助将不胜感激。谢谢
解决方案
您确定您的 .NET 代码在容器端口上公开了一个非 TLS HTTP 端点,80
并在 .NET 上公开了一个 TLS HTTP 端点443
吗?
32775
我怀疑不是这样,这可以解释为什么当端口绑定到主机(分别在主机上和32774
分别)时,您无法通过端口访问服务。
注意您的客户端代码尝试访问
http://localhost:32774
可能映射到容器的 TLS 端点 (:443
),因此您需要使用https://
和配置证书。
如果你在主机上运行 Linux,你可以尝试 telnet'ing 到这些端口,看看你是否得到响应:
telnet localhost 32775
telnet localhost 32774
如果您有gRPCurl(并且 IMO 应该适用于任何 gRPC 开发人员),您可以尝试列出方法:
grpcurl \
-plaintext \
-proto path/to/your.proto \
localhost:32775 \
list
grpcurl \
-plaintext \
-proto path/to/your.proto \
localhost:32774 \
list
注意我认为这
grpcurl
对于 TLS 和非 TLS 都是正确的,但是无法测试
推荐阅读
- flutter - 如何在 Flutter 中获取没有“索引”的值
- api - REST GET方法:可以返回丰富资源的列表吗?
- angularjs - 在角度应用程序中注入字符串有什么好处
- python - 在 SQL Server 中创建数据库用户时使用 pymssql 出错
- java - 无法从网页获取 XML 到 Java 中的字符串
- visual-studio - 如何在 Visual Studio 中同时观察递归函数变量
- python - eval 函数不会将类似 dict 的字符串变成 dict?
- java - 带有 Javassist 3.24.0-GA 的 Powermock 1.6.4 产生 javassist.CannotCompileException: by javassist.bytecode.BadBytecode
- sql - 用 00 或 0 替换任何包含“00”或“0”的字符串(在 SQL Server 中处理双引号)
- python - Python Numpy:反向转置