在已定义的端口上运行RC2项目

时间:2016-05-23 15:27:03

标签: docker dockerfile .net-core asp.net5 .net-core-rc2

好的,我创建了空的RC2项目并使用VS 2015本地运行它可以工作。

现在我想使用docker将它部署到linux服务器 - 所以我的dockerfile应该怎么样?我一直关注these instructions,这就是我最终的结果:

FROM microsoft/dotnet:1.0.0-preview1

COPY . /app
WORKDIR /app

RUN dotnet restore

EXPOSE 5004
ENTRYPOINT dotnet run

然后我构建了我的应用程序映像: docker build -t my_app。

并运行使用: docker run -t -p 8080:5004 my_app

之后我获得了图像正在运行的信息,它正在监听localhost:5000。不幸的是,我一直在尝试使用xxxx:5000,xxxx:5004和xxxx:8080连接到此服务器,并且这些地址都不起作用(xxxx是服务器地址)。

我做错了吗?

2 个答案:

答案 0 :(得分:2)

您还可以在Dockerfile级别指定Urls(如果要重用Container,则更好)。这是完整的Dockerfile:

FROM microsoft/dotnet

RUN printf "deb http://ftp.us.debian.org/debian jessie main\n" >> /etc/apt/sources.list

COPY . /app
WORKDIR /app
RUN ["dotnet", "restore"]
RUN ["dotnet", "build"]

EXPOSE 5000/tcp
ENTRYPOINT ["dotnet", "run", "--server.urls=http://0.0.0.0:5000"]

您还需要修改Program.cs文件以从主args中读取配置:

    public static void Main(string[] args)
    {
        var config = new ConfigurationBuilder()
            .AddCommandLine(args)
            .AddEnvironmentVariables(prefix: "ASPNETCORE_")
            .Build();

        var host = new WebHostBuilder()
            .UseConfiguration(config)
            .UseKestrel()
            .UseContentRoot(Directory.GetCurrentDirectory())
            .UseIISIntegration()
            .UseStartup<Startup>()
            .Build();

        host.Run();
    }

您有这个博客文章中的分步教程和原因: https://www.sesispla.net/blog/language/en/2016/05/running-asp-net-core-1-0-rc2-in-docker/

答案 1 :(得分:1)

您可以使用UseUrls()扩展方法告诉kestrel要侦听哪个端口,如下所示:

(这通常是我的Program.Main()入口点方法)

var host = new WebHostBuilder()
    .UseKestrel()
    .UseContentRoot(Directory.GetCurrentDirectory())
    .UseUrls("http://0.0.0.0:5004")
    .Build();

host.Run();

在这种情况下,您可以像这样运行docker镜像:

$ docker run -d -p 8080:5004 my_app

我选择了-d选项作为守护进程运行。只需确保Dockerfile中的EXPOSED端口与UseUrls中指定的端口匹配即可。有关此的完整示例,请随时查看我的github示例项目:https://github.com/mw007/adventure-works