説明:
PostgreSQLは、TCP / IPだけでなく、UNIXソケットを介した接続も受け入れる場合があります。 -h localhost 引数はpsqlに伝えます UNIXソケットではなくTCP接続を使用する。
現在の/docker-entrypoint-initdb.dのスクリプトの実行中にそれを見るでしょう。 PostgreSQLはUNIXソケットでのみリッスンし、起動ログには次のように表示されます。
LOG: listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
これは、psql -h localhostを意味します PostgreSQLはIPソケットをリッスンしないため、データベースに接続しません。 psqlを使用する必要があります なし -h localhost TCP接続の代わりにUNIXソケットを使用するようにするオプション。
しかし、なぜpsql -h localhostを実行するのか 手動で動作しますか?
docker-entrypoint.shを調べると ここでも、すべてのinitスクリプトが実行されると、PostgreSQLが停止
次に、開始
再び通常(操作)モードで、UNIXとIPソケットの両方でリッスンします:
LOG: listening on IPv4 address "0.0.0.0", port 5432
LOG: listening on IPv6 address "::", port 5432
LOG: listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
したがって、起動プロセスが完了すると、TCP接続を使用してPostgreSQLに接続できるため、コンテナに入り、psql -h localhostを実行できます。 成功します。