我正在跟踪https://app.pluralsight.com/library/courses/docker-web-development/table-of-contents,它使用较旧的 microsoft / aspnetcore-build 图像,但是我正在运行core 2.1,因此我正在使用 microsoft / dotnet:2.1 -sdk 。
我正在运行的命令是:
docker run -it -p 8080:5001 -v $ {pwd}:/ app -w“ / app” microsoft / dotnet:2.1-sdk
然后进入TTY,我运行了一个dotnet,它给出了以下输出:
使用/app/Properties/launchSettings.json中的启动设置...
信息: Microsoft.AspNetCore.DataProtection.KeyManagement.XmlKeyManager [0]
用户配置文件可用。使用'/root/.aspnet/DataProtection-Keys' 作为关键存储库;密钥不会在静止时被加密。
信息: Microsoft.AspNetCore.DataProtection.KeyManagement.XmlKeyManager [58]
使用创建日期创建密钥{5445e854-c1d9-4261-82f4-0fc3a7543e0a} 2018-12-14 10:41:13Z,激活日期2018-12-14 10:41:13Z和 到期日期2019-03-14 10:41:13Z。
警告: Microsoft.AspNetCore.DataProtection.KeyManagement.XmlKeyManager [35]
未配置XML加密器。键 {5445e854-c1d9-4261-82f4-0fc3a7543e0a}可以持久存储在 未加密的表格。
信息: Microsoft.AspNetCore.DataProtection.Repositories.FileSystemXmlRepository [39]
将数据写入文件 '/root/.aspnet/DataProtection-Keys/key-5445e854-c1d9-4261-82f4-0fc3a7543e0a.xml'。
警告:Microsoft.AspNetCore.Server.Kestrel [0]
在IPv6环回上无法绑定到https://localhost:5001 界面:“无法分配请求的地址”。
警告:Microsoft.AspNetCore.Server.Kestrel [0]
在IPv6环回上无法绑定到http://localhost:5000 界面:“无法分配请求的地址”。
托管环境:开发
内容根路径:/ app
应用程序已启动。按Ctrl + C关闭。
然后,当我在主机上打开浏览器并导航到http://localhost:8080时,出现“此页面无法正常工作”“ localhost没有发送任何数据”“ ERR_EMPTY_RESPONSE”
我也尝试了几种不同的端口组合,但结果相同。
有人可以发现我出了错吗?或有什么想法/建议?
答案 0 :(得分:2)
不确定该问题是否仍然与您相关,但是我也遇到了此问题,因此将解决方案留给了其他人。我在下一个docker命令中使用了PowerShell(几乎与您的命令相同,只是使用内部端口 90 而不是 5000 ,并使用了-rm 开关,它会在退出时自动删除容器):
docker run --rm -it -p 8080:90 -v ${pwd}:/app -w "/app" microsoft/dotnet /bin/bash
然后,我得到了交互式bash shell,并且在键入dotnet run
时得到与您相同的输出,并且无法通过localhost:8080
到达容器中的站点。
我通过使用UseUrls
方法或--urls
命令行参数来解决它。它们(UseUrls
方法或--urls
命令行参数)指示IP地址或主机地址以及服务器应侦听请求的端口和协议。以下是对我有用的解决方案的说明:
CreateWebHostBuilder
方法,如下所示:public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseUrls("http://+:90") //for your case you should use 5000 instead of 90
.UseStartup<Startup>();
如果需要,可以使用下一个语法.UseUrls("http://+:90;http://+:5000")
指定多个端口。
使用这种方法,您只需在bash shell中键入 dotnet run ,然后您的容器即可通过localhost:8080
访问。
但是使用以前的方法,您可以更改源代码的默认行为,您可以将其忘记,然后在将来进行调试和修复。
所以我更喜欢第二种方法而不更改源代码。键入docker命令并获取交互式bash shell而不是仅运行 dotnet 之后,使用--urls
参数将其键入,如下所示(在您的情况下,使用端口5000而不是90):
dotnet run --urls="http://+:90"
在the documentation中,还有第三种方法可以使用ASPNETCORE_URLS
环境变量,但是这种方法对我不起作用。我使用了下一个命令(使用 -e 开关):
docker run --rm -it -p 8080:90 -v ${pwd}:/app -w "/app" -e "ASPNETCORE_URLS=http://+:90" microsoft/dotnet /bin/bash
如果在bash中键入 printenv ,您将看到ASPNETCORE_URLS
环境变量已传递到容器,但由于某些原因