【问题标题】:Connect rails app in Docker container to external Postgresql Database via URL通过 URL 将 Docker 容器中的 Rails 应用程序连接到外部 Postgresql 数据库
【发布时间】:2017-03-23 04:04:03
【问题描述】:
我有一个带有 web rails 应用程序的 docker 容器。我的 osx 机器上还有外部数据库。如果我在 osx 上执行:
psql "postgres://postgres:testing@0.0.0.0:5432/movies_development"
我跑得很好
如果我在容器中运行它,我会收到
psql: could not connect to server: No such file or directory
Is the server running locally and accepting
connections on Unix domain socket "/var/run/postgresql/.s.PGSQL.5432"?
对如何从容器连接到外部数据库有任何想法吗?
谢谢
【问题讨论】:
标签:
ruby-on-rails
macos
postgresql
docker
【解决方案1】:
我找到了一种将 docker 容器中的应用程序连接到位于我的 osx 上的本地数据库的方法。
0.0.0.0:5432 是容器的 localhost 地址(不是 osx 的 localhost),我们必须设置一个新的:
- 在“首选项”>“网络设置”中找到 osx Ip 本地地址(我的是 192.168.0.102)
- 将此 Ip 添加到 postgresql 配置文件的
listener_address: '192.168.0.102, localhost' 行。
- 在 pg_hba.conf 文件中添加带有 Ip 192.168.0.102、主机和 md5 的额外行
- 重启 Postgresql
通过 ENV 在应用中设置连接设置,例如:postgres://postgres:testing@192.168.0.102:5432/movies_development
【解决方案2】:
根据您的问题,可能有两个原因:
- 您在构建 docker 映像期间是否暴露了
EXPOSE 5432?还是在使用 docker run -it -d --name $container_name -p 5432:5432 $image_name 启动容器之前?如果否,则您必须进行上述任何更改,然后才能连接到外部托管的数据库。
- 如果您使用
docker exec -it $container_name bash 进入您的docker 容器并执行此命令psql "postgres://postgres:testing@0.0.0.0:5432/movies_development",那么您的docker 容器中必须安装psql 客户端并使用正确的$PATH 变量,否则它会抛出类似命令未找到/否的错误这样的文件或目录。
-
注意:如果您的应用程序使用其他方式与数据库通信,那么您的应用程序将在没有 psql 客户端程序的情况下工作。
希望对您有所帮助。谢谢!