Как создать пользователя / базу данных в скрипте для 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/