Как создать пользователя / базу данных в скрипте для Docker Postgres

Я пытался настроить контейнер для экземпляра postgres разработки, создав пользовательский пользователь и базу данных. Я использую официальный postgres docker изображение. В документации он инструктирует вас вставить сценарий bash внутри /docker-entrypoint-initdb.d/ папка для настройки базы данных с любыми пользовательскими параметрами.

мой сценарий bash: make_db.sh

su postgres -c "createuser -w -d -r -s docker"
su postgres -c "createdb -O docker docker"

файла Docker

FROM library/postgres

RUN ["mkdir", "/docker-entrypoint-initdb.d"]
ADD make_db.sh /docker-entrypoint-initdb.d/

ошибка, которую я получаю от docker logs -f db (db - мой контейнер имя):

createuser: не удалось подключиться к базе данных Postgres: не удалось подключиться к серверу: нет такого файла или каталога

кажется, что команды внутри /docker-entrypoint-initdb.d/ папка выполняется до запуска postgres. Мой вопрос в том, как настроить пользователя/базу данных программно с помощью официального контейнера postgres? Есть ли способ сделать это с помощью скрипта?

4 ответов


EDIT-с 23 июля 2015

на официальный postgres docker изображение будет работать .sql скриптов в .

поэтому все, что вам нужно, чтобы создать следующий SQL-скрипт:

init.в SQL

CREATE USER docker;
CREATE DATABASE docker;
GRANT ALL PRIVILEGES ON DATABASE docker TO docker;

и добавьте его в свой Dockerfile:

Dockerfile

FROM library/postgres
COPY init.sql /docker-entrypoint-initdb.d/

но с 8 июля 2015 года если все, что вам нужно, это создать пользователь и база данных, легче просто использовать POSTGRES_USER, POSTGRES_PASSWORD и POSTGRES_DB переменные среды:

docker run -e POSTGRES_USER=docker -e POSTGRES_PASSWORD=docker -e POSTGRES_DB=docker library/postgres

или с Dockerfile:

FROM library/postgres
ENV POSTGRES_USER docker
ENV POSTGRES_PASSWORD docker
ENV POSTGRES_DB docker

для изображений старше 23 июля, 2015

С документация изображения Докера postgres, говорят, что

[...] он будет источником любого *.сценарий sh найден в этом каталоге [/docker-entrypoint-initdb.d] для дальнейшей инициализации перед запуск службы

что важно здесь "перед началом обслуживания". Это означает, что ваш скрипт make_db.sh будет выполняться до запуска службы postgres, следовательно, сообщение об ошибке "не удалось подключиться к базе данных Postgres".

после этого есть еще одна полезная информация:

Если вам нужно выполнить команды SQL как часть вашей инициализации, настоятельно рекомендуется использовать однопользовательский режим Postgres.

согласен, это может быть немного загадочным на первый взгляд. В нем говорится, что ваш сценарий инициализации должен запустить службу postgres в одном режиме перед выполнением ее действий. Чтобы вы могли изменить свой make_db.КШ скрипт следующим образом, и он должен приблизить вас к тому, что вы хотите:

Примечание, это изменилось в последнее время в следующем commit. Это будет работать с последним изменением:

export PGUSER=postgres
psql <<- EOSQL
    CREATE USER docker;
    CREATE DATABASE docker;
    GRANT ALL PRIVILEGES ON DATABASE docker TO docker;
EOSQL

ранее, использование --single режим требуется:

gosu postgres postgres --single <<- EOSQL
    CREATE USER docker;
    CREATE DATABASE docker;
    GRANT ALL PRIVILEGES ON DATABASE docker TO docker;
EOSQL

теперь вы можете поставить .файлы sql внутри каталога init:

документы

Если вы хотите сделать дополнительную инициализацию в образе, полученном из этого, добавьте один или несколько *.sql или *.SH скрипты под /docker-entrypoint-initdb.d (создание каталога при необходимости). После того, как entrypoint вызывает initdb для создания пользователя и базы данных postgres по умолчанию, он будет запускать любой *.sql файлы и источник любой *.скрипты sh, найденные в этом каталоге дальнейшая инициализация перед запуском службы.

Так копировать ваш .sql-файл будет работать.


Я добавляю пользовательские команды в среду, вызванную в CMD после запуска служб... Я не делал этого с postgres, но с Oracle:

#set up var with noop command
RUN export POST_START_CMDS=":"
RUN mkdir /scripts
ADD script.sql /scripts
CMD service oracle-xe start; $POST_START_CMDS; tail -f /var/log/dmesg

и начинаться с

docker run -d ... -e POST_START_CMDS="su - oracle -c 'sqlplus @/scripts/script' " <image>

.


перед созданием пользователей необходимо запустить базу данных. Для этого нужно несколько процессов. Вы можете запустить postgres в подрешетке ( & ) в сценарии оболочки или использовать инструмент supervisord для запуска postgres, а затем запускать любые сценарии инициализации.

руководство для супервизора и докера https://docs.docker.com/articles/using_supervisord/