1

我正在研究如何使用 docker 运行 openproject。我正在通过openproject/docker工作。

我已经使用外部 postgres 目录运行了 docker 映像。

我现在正在研究如何连接到现有的 postgresql 运行实例。

根据官方文档,我使用的命令行看起来不错。

编辑。在缺少的 -p 中添加。

docker run -p 8082:80 -p 5432:5432 --name openproject_dev -e SECRET_KEY_BASE=secret -e DATABASE_URL=postgresql://openproject:openproject-dev-
password@localhost:5432/openproject_dev  \
-v /Users/admin/var/lib/openproject/logs:/var/log/supervisor   \
-v /Users/admin/var/lib/openproject/static:/var/db/openproject   openproject/community:5.0

我省略了 -d [deamon] 标志,所以我可以看到任何错误。

创建 docker 容器时,我得到

-----> You're using an external database. Not initializing a local database cluster.
   /usr/src/app /usr/src/app
   Starting memcached: memcached.

我期望的。然后我收到一个关于连接到我没想到的 postgresql 服务器的错误。

...
PG::ConnectionBad: could not connect to server: Connection refused
Is the server running on host "localhost" (127.0.0.1) and accepting
TCP/IP connections on port 5432?
could not connect to server: Cannot assign requested address
Is the server running on host "localhost" (::1) and accepting
TCP/IP connections on port 5432?
/usr/local/bundle/gems/activerecord-
4.2.7.1/lib/active_record/connection_adapters/postgresql_adapter.rb:651:in `initialize'

我猜初始化容器的脚本期望 postgres 正在运行,但事实并非如此。您将如何在命令行上将 docker 容器端口转发到 5432 的请求发送到主机?...与 docker run -p 5432:5432 ...相反,它将 5432 从 docker 容器暴露给主机。

4

2 回答 2

2
-e DATABASE_URL=postgresql://openproject:openproject-dev-
password@localhost:5432/openproject_dev

当你添加这个 url 时,容器期望 postgres 在 localhost 上运行,即它本身。

如果您在主机上运行 postgres,您可以通过传入--network hostrun 命令让容器与主机共享网络堆栈。在这种情况下,localhost 将引用运行 postgres 的主机。

于 2017-09-13T06:41:08.060 回答
1

你的方法目前是错误的

docker run -p 8082:80 -p 5432:5432 --name openproject_dev -e SECRET_KEY_BASE=secret -e DATABASE_URL=postgresql://openproject:openproject-dev-password@localhost:5432/openproject_dev \ -v /Users/admin/ var/lib/openproject/logs:/var/log/supervisor \ -v /Users/admin/var/lib/openproject/static:/var/db/openproject openproject/community:5.0

当您使用-p 5432:5432它时,这意味着您希望在该端口上的 docker 内部运行一些东西,并且您希望您的主机5432端口映射到5432docker 内部。

接下来,如果您能够运行该命令,即使容器内没有任何内容正在侦听,那么这意味着您主机上的端口可用。5432这意味着 postgress 也没有在主机上监听。它可能正在侦听套接字。您应该尝试在主机上执行以下命令

psql -h 127.0.0.1

如果您无法使用它在主机上连接,则意味着 postgres db 绑定到套接字文件而不是 IP。现在你可以锻炼的选择很少

安装插座

docker run -p 8082:80 -p 5432:5432 --name openproject_dev -e SECRET_KEY_BASE=secret -e DATABASE_URL=postgresql://openproject:openproject-dev-password@localhost:5432/openproject_dev \ -v /Users/admin/ var/lib/openproject/logs:/var/log/supervisor \ -v : \ -v /Users/admin/var/lib/openproject/static:/var/db/openproject openproject/community:5.0

在主机上绑定 0.0.0.0

如果您不想挂载卷,则应将 psql 的绑定地址更改为0.0.0.0,然后将数据库 url 更改为-e DATABASE_URL=postgresql://openproject:openproject-dev-password@<YOURMACHINEIP>:5432/openproject_dev

在主机网络上运行

docker run --net host --name openproject_dev -e SECRET_KEY_BASE=secret -e DATABASE_URL=postgresql://openproject:openproject-dev-password@localhost:5432/openproject_dev \ -v /Users/admin/var/lib/openproject/日志:/var/log/supervisor \ -v : \ -v /Users/admin/var/lib/openproject/static:/var/db/openproject openproject/community:5.0

于 2017-09-13T07:19:16.620 回答