Postgresql 将容器化.NET核心MVC/WebAPI应用程序连接到本地安装的Postgres

Postgresql 将容器化.NET核心MVC/WebAPI应用程序连接到本地安装的Postgres,postgresql,docker,asp.net-core,devops,Postgresql,Docker,Asp.net Core,Devops,我已经搜索了几天,但我找不到解决方案 我将.NET Core 1.1和VS2017与Docker工具一起使用。当我使用自托管选项或IIS运行应用程序时,一切正常。我正在使用Ngpsql作为PostgreSQL的数据提供程序,而且效果很好。当我使用Docker作为容器运行应用程序时,问题出现了(镜像构建很好,容器在Windows和Linux中运行),因为我的Postgres主机是localhost,核心应用程序看不到我的本地PostgreSQL实例(因为对于容器而言,localhost是容器本身,

我已经搜索了几天,但我找不到解决方案

我将.NET Core 1.1和VS2017与Docker工具一起使用。当我使用自托管选项或IIS运行应用程序时,一切正常。我正在使用Ngpsql作为PostgreSQL的数据提供程序,而且效果很好。当我使用Docker作为容器运行应用程序时,问题出现了(镜像构建很好,容器在Windows和Linux中运行),因为我的Postgres主机是localhost,核心应用程序看不到我的本地PostgreSQL实例(因为对于容器而言,localhost是容器本身,而不是我的主机)。我知道通过Docker Compose(每个都有一个容器)使用.NET Core和PSQL有很多教程和演练。我认为它们工作得很好,但这项工作的要求是去容器化的核心应用程序从本地安装的PostgreSQL服务器读/写数据

在生产中,核心容器和本地安装的PostgreSQL将位于具有相同地址的同一台计算机中。我知道这一定是一个简单的参数或类似的东西,但我不想因为在连接字符串中使用my(development)machine ip而失去Docker容器的可移植性,因为生产服务器中的部署/运行场景将通过Docker Cloud等自动化


也许传递一个参数?正确暴露docker容器端口?什么?什么

您可以将此代码添加到您的
入口点

echo $(netstat -nr | grep '^0\.0\.0\.0' | awk '{print $2}') dockerhost >> /etc/hosts
脚本从容器内部获取网关IP地址。因为您的容器(可能)通过主机访问internet,所以网关IP将是主机和容器共享的任何网络上的主机IP。然后,它会在containers hosts文件中附加一个条目,以便脚本可以按名称引用主机IP(在本例中为任意“dockerhost”)

在入口点中运行脚本,即使在网络配置稍有不同的docker主机上部署映像,也可以获得正确的IP地址,因为主机入口是在容器运行时设置的,而不是在生成映像时设置的


来源:。有关更多信息,请参见《Thank@Ayushya》的可能副本,以测试该答案。事实上,该答案的作用是什么。请标记为复制品或类似的东西(我不知道确切的术语)。我已经遵循了这些步骤和工作。可能重复