我在asp.net核心创建了一个应用程序并创建了一个dockerfile来生成本地图像并运行它。
FROM microsoft/dotnet:latest
COPY . /app
WORKDIR /app
RUN ["dotnet", "restore"]
RUN ["dotnet", "build"]
EXPOSE 5000/tcp
ENTRYPOINT ["dotnet", "run", "--server.urls", "http://0.0.0.0:5000"]
然后,我用以下命令构建了我的图像
docker build -t jedidocker/first .
然后,我用以下命令创建了一个容器
docker run -t -d -p 5000:5000 jedidocker/first
但是当我将以下网址运行到我的主机浏览器
时http://localhost:5000/
我有ERR_EMPTY_RESPONSE
是网络问题吗?我该如何解决?
P.S:我的Windows版本是10.0.10586
答案 0 :(得分:13)
我遇到了同样的问题并找到了解决方法。您需要更改默认侦听主机名。默认情况下,应用程序将侦听localhost,忽略来自容器外部的任何传入请求。更改program.cs
中的代码以收听所有来电:
public class Program
{
public static void Main(string[] args)
{
var host = new WebHostBuilder()
.UseKestrel()
.UseContentRoot(Directory.GetCurrentDirectory())
.UseUrls("http://*:5000")
.UseIISIntegration()
.UseStartup<Startup>()
.Build();
host.Run();
}
}
更多信息:
https://medium.com/trafi-tech-beat/running-net-core-on-docker-c438889eb5a#.hwhoak2c0
确保运行带有端口绑定的-p
标志的容器。
docker run -p 5000:5000 <containerid>
在撰写本文时,似乎是
EXPOSE 5000:5000
命令与-p
命令的效果不同。我也没有用-P(大写)获得真正的成功。
编辑2016年8月28日:
有一点需要注意。如果您使用docker compose with -d(detached)模式,dotnet run
命令可能需要一段时间才能启动服务器。在执行命令(以及之前的任何其他命令)之前,您将在ERR_EMPTY_RESPONSE
中收到Chrome
。
答案 1 :(得分:5)
只需更新您的入口点,不需要更改代码:
ENTRYPOINT ["dotnet", "run", "--server.urls", "http://*:5000"]
Windows Server 2016上的默认Docker网络是NAT,因此您可能希望使用可以使用docker inspect <container name/ID>
找到的IP。不确定其他Windows版本是否也是这种情况。
答案 2 :(得分:1)
这是在ASP.NET 3.1中对我有用的东西
在Dockerfile上,您需要指定ENV ASPNETCORE_URLS
ENV ASPNETCORE_URLS http://*:5000
然后暴露端口
EXPOSE 5000
答案 3 :(得分:0)
使用HostUrl
作为环境变量
appsettings.json
{
"Logging": {
"IncludeScopes": false,
"Debug": {
"LogLevel": {
"Default": "Warning"
}
}
},
"HostUrl": "http://*:8080"
}
program.cs
public class Program
{
public static void Main(string[] args)
{
var hosturl = configuration.GetSection("HostUrl").Value;
var host = new WebHostBuilder()
.UseKestrel()
.UseContentRoot(Directory.GetCurrentDirectory())
.UseUrls(hosturl)
.UseIISIntegration()
.UseStartup<Startup>()
.Build();
host.Run();
}
}
然后,您可以将HostUrl作为docker run
docker run --rm -it -e HostUrl="http://*:80" -e DOTNET_RUNNING_IN_CONTAINER=true -e ConnectionStrings__DefaultConnection="<your_connection>" -p 80:80 <containerid>
通过localhost
打开浏览器,感到高兴!