如何在 Docker 上本地运行 .net core Web api?

问题描述 投票:0回答:3

我创建了一个 Web api,可以在本地主机上的 Visual Studio 中本地运行,并且可以通过它访问 Swagger。 http://localhost:5000/swagger/index.html。

我创建了一个 Dockerfile 并执行了

docker build -t test .
,我可以看到在 Docker Desktop 中创建的镜像。运行它时,我没有收到任何错误,并且收到以下日志:

=info: Microsoft.Hosting.Lifetime[14]

      Now listening on: http://[::]:80

info: Microsoft.Hosting.Lifetime[0]

      Application started. Press Ctrl+C to shut down.

info: Microsoft.Hosting.Lifetime[0]

      Hosting environment: Production

info: Microsoft.Hosting.Lifetime[0]

      Content root path: /app

我需要做什么才能通过以下方式访问 Web api:浏览器?

docker dockerfile asp.net-core-webapi
3个回答
3
投票

Microsoft 在其基础映像中将环境变量 ASPNETCORE_URLS 设置为

http://+:80
,因此您的应用程序在容器中运行时正在侦听端口 80。

您还应该注意,Swagger 通常在容器中不可用,因为默认情况下 Swagger 仅在开发环境中运行时可用。默认情况下,容器不被视为开发。

因此,要运行容器并访问 Swagger,您应该使用如下命令来运行容器

docker run --rm -d -e ASPNETCORE_ENVIRONMENT=Development -p 5000:80 test

然后您应该能够在 http://localhost:5000/ 上访问您的 webapi 并使用 Swagger。


0
投票

对我来说 ASPNETCORE_URLS 不起作用,原因是它被从我的应用程序设置获取 url 的 UseUrls 覆盖: “网址”:“http://localhost:5000”

即使我在 Program.cs 中注释掉 UseUrls(),它仍然会自动从 appsettings.json 中获取 url!

我将 appsettings.json 中的值更改为: “网址”:“http://localhost:5000” 到 “网址”:“http://+:5000” 现在我的应用程序可以通过我转发到的任何端口访问,

假设我们运行一个发布端口的新容器: -p 5001:5000 然后可以从我的浏览器在 localhost:5001 访问 api


0
投票

我看看问题是什么,您的 Docker 文件中一定缺少 ASPNETCORE_URLS 参数,这就是您的外部请求无法到达容器端口的原因,请参阅以下适用于您的项目的 docker 文件步骤

FROM mcr.microsoft.com/dotnet/sdk:8.0 as base

COPY . /home

RUN dotnet restore /home/gemini.csproj
RUN dotnet publish /home/gemini.csproj -o publish

FROM mcr.microsoft.com/dotnet/sdk:8.0
WORKDIR /app
COPY --from=base /publish /app/

EXPOSE 55002
ENV ASPNETCORE_URLS=http://+:5000
CMD [ "dotnet", "gemini.dll" ]
© www.soinside.com 2019 - 2024. All rights reserved.