#postgresql #docker
#postgresql #docker
Вопрос:
Когда я пытаюсь запустить контейнер, подобный этому:
db:
container_name: database-pg
image: postgres
ports:
- 127.0.0.1:5432:5432
restart: always
logging:
<<: *logging_default
volumes:
- datavolume:/var/lib/postgresql/data
- ./backend/db/migrations/0001-init.up.sql:/docker-entrypoint-initdb.d/0001-init.up.sql
- ./envs/ropsten/seed.sql:/docker-entrypoint-initdb.d/0002-seed.sql
environment:
- POSTGRES_PASSWORD=postgres
- POSTGRES_USER=postgres
- POSTGRES_HOST_AUTH_METHOD=trust
Я вижу это:
2021-01-09 12:00:48.362 UTC [89] FATAL: password authentication failed for user "postgres"
2021-01-09 12:00:48.362 UTC [89] DETAIL: Password does not match for user "postgres".
Connection matched pg_hba.conf line 99: "host all all all md5"
2021-01-09 12:01:47.477 UTC [91] FATAL: password authentication failed for user "postgres"
2021-01-09 12:01:47.477 UTC [91] DETAIL: Password does not match for user "postgres".
Connection matched pg_hba.conf line 99: "host all all all md5"
2021-01-09 12:01:47.909 UTC [92] FATAL: password authentication failed for user "postgres"
2021-01-09 12:01:47.909 UTC [92] DETAIL: Password does not match for user "postgres".
Connection matched pg_hba.conf line 99: "host all all all md5"
2021-01-09 12:01:47.988 UTC [93] FATAL: password authentication failed for user "postgres"
2021-01-09 12:01:47.988 UTC [93] DETAIL: Password does not match for user "postgres".
Connection matched pg_hba.conf line 99: "host all all all md5"
2021-01-09 12:01:48.540 UTC [94] FATAL: password authentication failed for user "postgres"
2021-01-09 12:01:48.540 UTC [94] DETAIL: Password does not match for user "postgres".
Connection matched pg_hba.conf line 99: "host all all all md5"
2021-01-09 12:01:48.627 UTC [95] FATAL: password authentication failed for user "postgres"
2021-01-09 12:01:48.627 UTC [95] DETAIL: Password does not match for user "postgres".
Connection matched pg_hba.conf line 99: "host all all all md5"
Я не могу понять, почему это происходит. Почему postgres вообще показывает эту ошибку, какой еще пароль должен быть при запуске.
Комментарии:
1. Почему я вижу
pq: password authentication failed for user "postgres"
, когда я запускаю режим доверия?- POSTGRES_HOST_AUTH_METHOD=trust
Ответ №1:
Я попытался запустить postgres, используя вашу конфигурацию (я только что удалил раздел ведения журнала и томов), и все было в порядке.
Мне кажется, что вы устанавливаете POSTGRES_HOST_AUTH_METHOD=trust
конфигурацию после инициализации базы данных. В официальном изображении docker есть примечание readme:
Эта необязательная переменная может использоваться для управления методом аутентификации для подключений к хосту для всех баз данных, всех пользователей и всех адресов. Если не указано, то используется аутентификация по паролю md5. В неинициализированной базе данных файл pg_hba.conf будет заполнен с помощью этой приблизительной строки:
echo "host all all all $POSTGRES_HOST_AUTH_METHOD" >> pg_hba.conf
Итак, чтобы решить вашу проблему, вы должны либо удалить свои данные и воссоздать базу данных, либо смонтировать свой собственный обновленный файл pg_hba.conf:
version: '3'
services:
db:
container_name: database-pg
image: postgres
ports:
- 127.0.0.1:5433:5432
restart: always
environment:
- POSTGRES_PASSWORD=postgres
- POSTGRES_USER=postgres
- POSTGRES_HOST_AUTH_METHOD=trust
command: postgres -c 'hba_file=/var/lib/postgresql/pg_hba.conf'
volumes:
- datavolume:/var/lib/postgresql/data
- ./backend/db/migrations/0001-init.up.sql:/docker-entrypoint-initdb.d/0001-init.up.sql
- ./envs/ropsten/seed.sql:/docker-entrypoint-initdb.d/0002-seed.sql
- ./hba.conf:/var/lib/postgresql/pg_hba.conf
где hba.conf:
# "local" is for Unix domain socket connections only
local all all trust
# IPv4 local connections:
host all all 127.0.0.1/32 trust
# IPv6 local connections:
host all all ::1/128 trust
# Allow replication connections from localhost, by a user with the
# replication privilege.
local replication all trust
host replication all 127.0.0.1/32 trust
host replication all ::1/128 trust
# warning trust is enabled for all connections
# see https://www.postgresql.org/docs/12/auth-trust.html
host all all all trust
Комментарии:
1. Я действительно воссоздал базу данных, но это не помогло. Конечно, я добавил нужный мне результат, внеся изменения в привилегии пользователя с помощью SQL. Но это всего лишь костыль. Я до сих пор не понимаю, почему это происходит, я подозреваю, что это может быть связано с тем, что я использую macos, хотя я до сих пор понятия не имею, как это может быть
2. @mrsubject это действительно странно. Я тоже использую macOS, поэтому не думаю, что это причина. Вы пытались смонтировать обновленный файл pg_hba.conf?
3. Нет, и я не хочу создавать свой собственный образ, я просто хочу использовать официальную готовую копию. И, да, по какой-то причине это изображение, похоже, не реагирует на переменные среды, хотя, если вы подключаетесь к изображению и просматриваете переменные, я действительно вижу переменные в своей среде. Я пытался полностью удалить образ и переустановить установку, но все безрезультатно, помогает только костыль в виде
ALTER ROLE postgres WITH PASSWORD 'postgres'
.4. Удивительно, но я могу подключиться к базе данных локально, без пароля, это работает верно. Но это работает только в локальной среде. Если я попытаюсь сделать это вне контейнера, возникает проблема.
5. Вам не нужно создавать свой собственный образ, чтобы использовать ваш файл pg_hba.conf. Вы просто добавляете еще одну строку в раздел «Объемы». Я обновил свой ответ