Роль 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
смонтировать этот том, чтобы база данных была повторно инициализирована при запуске контейнера.