我创建了一个 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:浏览器?
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。
对我来说 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
我看看问题是什么,您的 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" ]