Образ Postgres Docker не создает базу данных с произвольным именем - PullRequest
1 голос
/ 19 июня 2019

Документация postgres образа Docker говорит следующее о env var POSTGRES_DB:

Эта необязательная переменная окружения может использоваться для определения другого именидля базы данных по умолчанию, которая создается при первом запуске образа.Если он не указан, будет использовано значение POSTGRES_USER.

Я обнаружил, что это совсем не так.Например, с этой конфигурацией:

version: '3.7'

services:
  db:
    image: postgres:11.3-alpine
    restart: always
    container_name: store
    volumes:
      - postgres_data:/var/lib/postgresql/data/
    ports:
      - 5432:5432
    environment:
      - POSTGRES_USER=custom
      - POSTGRES_DB=customname
      - POSTGRES_PASSWORD_FILE=/run/secrets/db_password
    secrets:
      - db_password

volumes:
  postgres_data:

secrets:
  db_password:
    file: config/.secrets.db_password

База данных по умолчанию называется postgres, а не customname, как я указал:

$ docker exec -it store psql -U custom customname
psql: FATAL:  database customname does not exist
$ docker exec -it store psql -U custom postgres
psql (11.3)
Type help for help.

postgres=# ^D

Я что-то упускаю из виду?

Ответы [ 2 ]

1 голос
/ 20 июня 2019

Предоставляя переменные среды, вы ДОЛЖНЫ создать базу данных customname при инициализации контейнера. Нет необходимости создавать имя пользователя и базу данных в сценариях инициализации /docker-entrypoint-initdb.d/.

Я бы удостоверился, что нет никакого зависания postgres_data тома. Если вы ранее запустили контейнер без указания переменных среды, том будет создан для базы данных postgres по умолчанию. При следующем запуске контейнера (с указанным POSTGRES_DB env) часть создания базы данных будет пропущена.

Просто чтобы убедиться, удалите любой созданный том (имя должно быть примерно таким: *_postgres_data)

docker volume ls
docker volume rm <volume_name>

См. Пользователь и БД также не были созданы из аргументов переменных среды . Надеюсь, что это поможет

1 голос
/ 19 июня 2019

Сначала необходимо создать базу данных.

Если вы хотите сделать это автоматически для новых каталогов данных, то официальный образ Docker Postgres может сделать это, поместив Сценарии инициализации с расширением .sql в * 1006.* каталог.

Например, создайте файл со следующим содержимым:

CREATE USER custom_user;
CREATE DATABASE custom_db;
GRANT ALL PRIVILEGES ON DATABASE custom_db TO custom_user;

и сохраните его в /docker-entrypoint-initdb.d/create-db.sql в контейнере, например, с COPY в Dockerfile.Сценарии с расширением .sql внутри этого каталога будут выполняться только в том случае, если каталог DATA пуст, а несколько файлов будут выполняться в алфавитном порядке имен файлов.

Если вы хотите настроить его вручную, вы можететакже выполните это с помощью утилиты createb

createdb [connection-option...] [option...] [dbname [description]]

или подключившись к базе данных postgres, и используйте команду CREATE DATABASE ..., например,

docker exec -it store psql -U postgres -c 'CREATE DATABASE customname;'

Есливы подключаетесь в интерактивном режиме, как в вашем вопросе, вы можете сделать следующее:

$ docker exec -it store psql -U postgres
psql (11.3)
Type help for help.

postgres=# CREATE DATABASE customname;
CREATE DATABASE

postgres=# \c customname

Последняя команда соединит вас с базой данных customname.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...