Изглежда като този ангажимент счупи вашия скрипт.
Обяснение:
PostgreSQL може да приема връзки не само чрез TCP/IP, но и чрез UNIX сокет. -h localhost
аргумент казва psql
да използвате TCP връзки вместо UNIX сокет.
Ако погледнете текущия docker-entrypoint.sh
версия, ще видите, че по време на изпълнението на скриптове в /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
опция, за да го накарате да използва UNIX сокет вместо TCP връзки.
Но защо да изпълнявате psql -h localhost
ръчно работи?
Ако погледнете в docker-entrypoint.sh
отново ще видите, че когато всички начални скриптове се изпълняват, 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"
Така че, когато процесът на стартиране приключи, можете да се свържете с PostgreSQL чрез TCP връзки, като по този начин влезете в контейнера и стартирате psql -h localhost
успява.