Роль docker postgres не существует

Я использую postgres с docker и испытываю с ним проблемы. Я успешно выполнил docker-compose up --build

Когда я выполняю нижеприведенную команду, она работает нормально. psql запускается с пользователем my_username, как и ожидалось. Я могу видеть свою базу данных, команды \l, \dt работают нормально.

docker-compose exec db psql --username=my_username --dbname=my_database

>

Но когда я запускаю следующие команды, я получаю ошибку роль "postgres" не существует,
. Кроме того, \l, \dt не работают, даже команда psql не работает

docker exec -it my_db_container_1 bash

su - postgres

createuser --createdb --password new_user

Как правильно поступить во втором случае? Что происходит не так? Я запутался

docker-compose.yml

version: "3.9"

services:
  #### other services ####
  db:
    image: postgres:latest
    restart: always
    environment:
      POSTGRES_DB: my_database
      POSTGRES_USER: my_username
      POSTGRES_PASSWORD: my_password
    ports:
      - 5432
    volumes:
      - postgres_data:/var/lib/postgresql/data/


volumes:
  postgres_data:
  

Вы изменили имя пользователя/базу данных/пароль по умолчанию, с которыми инициализируется база данных postgres, указав переменные среды POSTGRES_USER, POSTGRES_DB и POSTGRES_PASSWORD. Когда вы запускаете createuser без опции -U, он пытается подключиться как текущий пользователь (в данном случае postgres), который не существует в базе данных, поскольку вы инициализировали ее пользователем my_username. Причина, по которой docker-compose exec db psql --username=my_username --dbname=my_database работает, заключается в том, что вы правильно указали имя пользователя и имя базы данных, которыми была инициализирована база данных.

Если удалить переменные окружения POSTGRES_USER и POSTGRES_DB, он будет инициализироваться с параметрами по умолчанию postgres/postgres.

Обратите внимание на то, что поскольку вы монтируете том в этот контейнер, в котором уже есть инициализированная база данных, она не будет повторно инициализирована, даже если вы перезапустите свой compose. Вам нужно docker volume rm смонтировать этот том, чтобы база данных была повторно инициализирована при запуске контейнера.

Вернуться на верх