Docker에서 Postgres를 실행하며 Discourse를 구동하는 방법

안녕하세요

로컬 개발 환경에서 Discourse를 설정하려고 하는데, 하나만 다릅니다: Postgres를 Docker에서 실행하고 있습니다.

OS에서 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 · GitHub

app.yml 파일에서 postgres 템플릿을 제거해야 할 수도 있습니다.

이 문서가 도움이 될 수 있습니다. 별도의 서버에서 실행하는 것은 아니지만, 나머지 내용은 모두 관련이 있을 것입니다.

도움이 되길 바랍니다!

안녕하세요 @phil22

답변해 주셔서 감사합니다.

Discourse는 Docker 컨테이너 안에서 실행되지 않고, 제 운영체제(OS)에서 직접 실행되고 있습니다. Postgres는 컨테이너 안에서 실행 중이며, 해당 포트는 OS에 -p 5432:5432 옵션으로 노출되어 있습니다.

이는 Discourse가 파일 시스템 소켓을 통해 연결을 시도하고 있지만 해당 소켓이 존재하지 않는다는 의미입니다.

config/database.yml 파일의 development 섹션 아래에 port: 5432를 추가해 보실 수 있나요?

안녕하세요 @Falco
답변해 주셔서 감사합니다.
같은 문제가 발생합니다.

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)

좋아요, 이 줄을 추가해 보세요:

  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 코드를 확인해 볼 수 있습니다.