РЕДАКТИРОВАТЬ - с 23 июля 2015 года
На официальном образе докера postgres будут запускаться .sql
скрипты, найденные в /docker-entrypoint-initdb.d/
папке.
Поэтому все, что вам нужно, это создать следующий скрипт 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 Docker сказано, что
[...] он найдет любой сценарий * .sh, найденный в этом каталоге [ /docker-entrypoint-initdb.d
], чтобы выполнить дальнейшую инициализацию перед запуском службы
Здесь важно «перед запуском сервиса» . Это означает, что ваш скрипт make_db.sh будет выполнен до запуска службы postgres, поэтому появляется сообщение об ошибке «Не удалось подключиться к базе данных postgres» .
После этого есть еще одна полезная информация:
Если вам нужно выполнить команды SQL как часть вашей инициализации, настоятельно рекомендуется использовать однопользовательский режим Postgres.
Согласитесь, это может быть немного загадочно на первый взгляд. Это говорит о том, что ваш скрипт инициализации должен запустить службу postgres в одиночном режиме перед выполнением его действий. Таким образом, вы можете изменить свой скрипт make_db.ksh следующим образом, и он должен приблизить вас к тому, что вы хотите:
ПРИМЕЧАНИЕ , это недавно изменилось в следующем коммите . Это будет работать с последними изменениями:
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
gosu postgres postgres --single < /tmp/somefile.sql