如果ASP.NET Core 3.1应用程序运行在容器中,我将无法访问容器。目标是在端口5000上的容器中运行应用程序。当我使用标准VS配置文件在本地运行它时,我会导航到http://localhost:5000/swagger/index.html以便加载swaggerUI。我想使用docker来实现同样的事情。
复制我的问题的步骤:
-
添加带有暴露的5000端口和ENV ASPNETCORE_URLS变量的dockerfile:
FROM mcr.microsoft.com/dotnet/core/aspnet:3.1 AS base WORKDIR /app ENV ASPNETCORE_URLS=http://+:5000 EXPOSE 5000 FROM mcr.microsoft.com/dotnet/core/sdk:3.1 AS build WORKDIR /src COPY ["myapp/myapp.csproj", "myapp/"] RUN dotnet restore "myapp/myapp.csproj" COPY . . WORKDIR "/src/myapp/" RUN dotnet build "myapp.csproj" -c Release -o /app/build FROM build AS publish RUN dotnet publish "myapp.csproj" -c Release -o /app/publish FROM base AS final WORKDIR /app COPY --from=publish /app/publish . ENTRYPOINT ["dotnet", "myapp.dll"]
-
构建图像
docker build -t myapp .
-
运行docker图像:
docker run myapp -p 5000:5000
使用特定的docker文件运行上面的命令会导致以下结果:
[21:28:42 INF] Starting host.
[21:28:42 INF] Now listening on: http://[::]:5000
[21:28:42 INF] Application started. Press Ctrl+C to shut down.
[21:28:42 INF] Hosting environment: Production
[21:28:42 INF] Content root path: /app
但是,我无法使用访问容器http://localhost:5000/swagger/index.html由于ERR_CONNECTION_REFUSED->无法访问此网站。
我确实进入容器检查主机是否确实在运行,使用:
docker exec -it containerId /bin/bash
cd /app
dotnet myapp.dll
是什么导致了以下错误:
Unable to start Kestrel.
System.IO.IOException: Failed to bind to address http://[::]:5000: address already in use.
结论是,容器内部的端口已被使用,应用程序是活动的,只是无法从外部访问。我不知道该怎么进去。请给我指正确的方向。
更新问题已解决,答案如下。然而,解释为什么需要它以及它是如何工作的将是很好的!
为了解决这个问题,我不得不手动添加"--server.uls";到如下所示的入口点:
ENTRYPOINT ["dotnet", "myapp.dll", "--server.urls", "https://+:5000"]
我通过以下方式解决了相同的问题:
- 在
appsettings.json
中添加以下内容以强制Kestrel监听端口80
"Kestrel": {
"EndPoints": {
"Http": {
"Url": "http://+:80"
}
}
}
- 暴露
dockerfile
中的端口
ENV ASPNETCORE_URLS=http://+:80
EXPOSE 80
ENTRYPOINT ["dotnet", "EntryPoint.dll"]
- 使用以下命令运行容器
docker run -p 8080:80 <image-name>:<tag>
http://localhost:8080/
上曝光的应用程序