1. 状況
-h
を指定しないと NG
$ psql my-postgres my-postgres -p 5432
psql: error: 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?
$
2. 対策
-h
を指定すると OK
$ psql my-postgres my-postgres -p 5432 -h localhost
Password for user my-postgres:
...
$
3. 理由
ChatGPT 先生曰く...
-h
を指定した場合
- ネットワークを使用して、リモートのサーバに接続を試みます
-h
を省略した場合
- UNIXドメインソケットを使用して、ローカルのパソコンに接続を試みます
UNIXドメインソケットは、同じマシン上のプロセス間通信に使用されます。この場合、
psql
は/var/run/postgresql/.s.PGSQL.5432
というパスのソケットファイルを探します。しかし、Dockerを使用してPostgreSQLサーバーを実行している場合、サーバーは別のコンテナ内にあり、UNIXドメインソケットは使用できません。そのため、
-h
オプションを使用してホスト名またはIPアドレス(この場合はlocalhost
)を指定する必要があります。これにより、psql
はTCP/IP接続を使用してサーバーに接続します。したがって、
-h
オプションを省略すると、psql
はUNIXドメインソケットを使用して接続を試み、その結果として上記のエラーが発生します。
-
-h localhost
を省略しても localhost と通信するんだけど、異なる通信方式を採用してしまうためこの問題が起こるというのがこの問題のポイント - エラー文に
No such file or directory
とあったのでファイルのアクセス権の問題なのかなと思ったら全然違いました... Stackoverflow の記事にも気づけず解決にかなり時間を割いてしまいましたので Qiita にメモを残しました...orz