Не удается запустить pg в docker

#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. Вы просто добавляете еще одну строку в раздел «Объемы». Я обновил свой ответ