使用 Docker 中的 Postgres 运行 discourse

您好

我正在尝试在我本地开发环境中设置 Discourse,但有一个小小的不同之处:我正在 Docker 中运行 Postgres。
可以通过 psql 从操作系统访问数据库,但当我尝试使用 rake 或 rails 创建数据库时,它不起作用。我遵循了以下步骤:

cp discourse_defaults.conf discourse.conf

然后更新了 discourse.conf

...
db_host = 127.0.0.1
...
db_username = postgres
db_password = mysecretpassword
...

但当我尝试运行 db:create 时

connection to server on socket "/var/run/postgresql/.s.PGSQL.5432" failed: No such file or directory

	Is the server running locally and accepting connections on that socket?
Couldn't create 'discourse_development' database. Please check your configuration.
rails aborted!
ActiveRecord::NoDatabaseError: connection to server on socket "/var/run/postgresql/.s.PGSQL.5432" failed: No such file or directory

	Is the server running locally and accepting connections on that socket?


Caused by:
PG::ConnectionBad: connection to server on socket "/var/run/postgresql/.s.PGSQL.5432" failed: No such file or directory

	Is the server running locally and accepting connections on that socket?


Tasks: TOP => db:create
(See full trace by running task with --trace)

我尝试使用 .env

DISCOURSE_DB_HOST=127.0.0.1
DISCOURSE_DB_USERNAME=postgres
DISCOURSE_DB_PASSWORD=mysecretpassword

我还尝试为 ‘DB_HOST’ 使用不同的 IP 地址,但仍然收到相同的错误。
我是否遗漏了什么?

我不确定,但我认为问题可能在于 discourse 运行在 docker 容器内,因此默认情况下无法访问您单独的 postgres 容器。

我认为您需要使用类似这样的配置来公开数据库:GitHub - discourse/discourse_docker: A Docker image for Discourse

您可能还需要从 app.yml 文件中删除 postgres 模板。

这些文档可能会有帮助——虽然您不是在单独的服务器上运行,但其他所有内容都应该相关。

希望这有帮助!

你好 @phil22

感谢你的回复。

Discourse 不是运行在 Docker 容器中,它运行在我的操作系统上。Postgres 运行在容器中,我将其端口暴露给了操作系统 -p 5432:5432

这意味着 Discourse 正在尝试通过文件系统套接字进行连接,但该套接字不存在。

您能否尝试在 config/database.yml 文件中,development 部分下添加 port: 5432

你好 @Falco
谢谢你的回复。
同样的问题

连接到套接字“/var/run/postgresql/.s.PGSQL.5432”上的服务器失败:没有那个文件或目录
    服务器是否在本地运行并接受该套接字的连接?
无法创建“discourse_development”数据库。请检查您的配置。
rails aborted!
ActiveRecord::NoDatabaseError: 连接到套接字“/var/run/postgresql/.s.PGSQL.5432”上的服务器失败:没有那个文件或目录
    服务器是否在本地运行并接受该套接字的连接?


Caused by:
PG::ConnectionBad: 连接到套接字“/var/run/postgresql/.s.PGSQL.5432”上的服务器失败:没有那个文件或目录
    服务器是否在本地运行并接受该套接字的连接?

任务:TOP => db:create
(通过运行带 --trace 的任务查看完整跟踪)

好的,请尝试添加这一行:

  url: postgresql://postgres::postgres@localhost:5432/discourse_development?pool=5

而不是 port 那一行。

谢谢 @Falco
我尝试将所有缺失的信息添加到 database.yml,现在它能正常工作了

#cat database.yml 
development:
  prepared_statements: false
  adapter: postgresql
  database: <%= ENV['DISCOURSE_DEV_DB'] || 'discourse_development' %>
  min_messages: warning
  port: 5432
  host: localhost
  user: postgres
  password: mysecretpassword
  pool: 5
  timeout: 5000

这是否意味着配置文件变量的加载存在问题?

不,这仅仅意味着默认的 socket 优先于 port 声明。一种解决方法是使用 url 键,但你可以查看 Rails 代码以了解其他方法。

2 个赞