gpt4 book ai didi

docker - ASP.net Core Web App 在 Docker 容器中运行时未接收请求

转载 作者:行者123 更新时间:2023-12-02 18:18:36 25 4
gpt4 key购买 nike

我想 docker 化 一个简单的 ASP.net Core Web 应用程序,它使用 Kestrel 托管 REST API。

正如您在控制台输出中看到的那样,当我在本地机器上运行该应用程序时,它运行良好。 我看到它正在监听的 URL 以及我为确保它正确运行而调用的端点:

> dotnet DockerTest.dll
> Hosting environment: Production
> Now listening on: https://localhost:5001
> Now listening on: http://localhost:5000
> Application started. Press Ctrl+C to shut down.
> info: Microsoft.AspNetCore.Hosting.Internal.WebHost[1]
Request starting HTTP/1.1 GET http://localhost:5000/api/values
...

现在到 docker 部分:

我的 Dockerfile 很简单。我拉取 ASP.net Core 基础镜像,从 dotnet publish "DockerTest.csproj" -c Release -o ./output 复制输出并像我在本地机器上执行它一样执行它:

Dockerfile:

FROM mcr.microsoft.com/dotnet/core/aspnet:2.2
WORKDIR /app
COPY ./output .
ENTRYPOINT ["dotnet", "DockerTest.dll"]

使用 docker build -t dockertest . 构建镜像后,我使用端口绑定(bind)以及 ASPNETCORE_URLS环境变量,让它在 http://localhost:5000 上运行类似于我的本地设置:

docker run -p 5000:5000 -e ASPNETCORE_URLS="http://localhost:5000" dockertest

容器的输出表明应用正在监听 http://localhost:5000 :

> Hosting environment: Production
> Content root path: C:\app
> Now listening on: http://localhost:5000
> Application started. Press Ctrl+C to shut down.

但是当我尝试访问端点时,我得到一个超时并且容器永远不会收到请求!

最佳答案

您的问题是由您指定 ASPNETCORE_URLS 的方式引起的。 .而不是绑定(bind)到 localhost , 你应该 监听所有网络接口(interface)为了接收来自容器外部的请求。

这可以通过收听 来完成。 0.0.0.0 而不是 localhost,或者使用 通配符 ,例如:

docker run -p 5000:5000 -e ASPNETCORE_URLS="http://+:5000"

如果支持 HTTP 和 HTTPS:

docker run -p 5000:5000 -p 5001:5001 -e ASPNETCORE_URLS="http://+:5000;https://+:5001"

或者使用默认端口时:

docker run -p 5000:80 -p 5001:443 -e ASPNETCORE_URLS="https://+;http://+"

我的首选方法是使用通配符 URL,并在必要时通过显式环境变量覆盖端口,例如:

-p 5000:80 -p 5001:5001 -e ASPNETCORE_URLS="https://+;http://+" -e ASPNETCORE_HTTPS_PORT=5001

关于docker - ASP.net Core Web App 在 Docker 容器中运行时未接收请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59619450/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com