Có vẻ như cam kết này đã làm hỏng tập lệnh của bạn.
Giải thích:
PostgreSQL có thể chấp nhận các kết nối không chỉ qua TCP / IP mà còn qua ổ cắm UNIX. -h localhost
đối số nói với psql
để sử dụng kết nối TCP thay vì ổ cắm UNIX.
Nếu bạn xem xét docker-entrypoint.sh hiện tại
phiên bản, bạn sẽ thấy, điều đó trong quá trình thực thi các tập lệnh trong /docker-entrypoint-initdb.d
PostgreSQL chỉ lắng nghe trên ổ cắm UNIX và nhật ký khởi động cho biết:
LOG: listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
Điều này có nghĩa là psql -h localhost
sẽ không kết nối với cơ sở dữ liệu, vì PostgreSQL không lắng nghe trên ổ cắm IP. Bạn phải sử dụng psql
không có -h localhost
tùy chọn để làm cho nó sử dụng ổ cắm UNIX thay vì kết nối TCP.
Nhưng tại sao lại chạy psql -h localhost
hoạt động thủ công?
Nếu bạn nhìn vào docker-entrypoint.sh
một lần nữa, bạn sẽ thấy rằng khi tất cả các tập lệnh init được thực thi, PostgreSQL đang được đã dừng
và sau đó bắt đầu
lại ở chế độ bình thường (hoạt động), trong đó nó nghe cả trên ổ cắm UNIX và 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"
Vì vậy, khi quá trình khởi động hoàn tất, bạn có thể kết nối với PostgreSQL bằng kết nối TCP, do đó, nhập vào vùng chứa và chạy psql -h localhost
thành công.