РЕДАКТИРОВАТЬ - с 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
psql -U myDb -d myDb -f myDb.sql
docker-entrypoint-initdb.d
я вижу мойinit.sql
с кодом sql в нем. НО, когда я открываю mysql (используя root-доступ) и набираю show database, я вижу только значение по умолчанию изdocker-compose.yml
файла! Почему это не работает для меня?db.sql
даже после того, как он скопирован в `docker-entrypoint-initdb.d`Теперь вы можете поместить файлы .sql в каталог init:
Из документов
Так что копирование вашего .sql файла в будет работать.
источник
Warning: scripts in /docker-entrypoint-initdb.d are only run if you start the container with a data directory that is empty; any pre-existing database will be left untouched on container startup. One common problem is that if one of your /docker-entrypoint-initdb.d scripts fails (which will cause the entrypoint script to exit) and your orchestrator restarts the container with the already initialized data directory, it will not continue on with your scripts.
Используя
docker-compose
:Предполагая, что у вас есть следующая структура каталогов:
Файл:
docker-compose.yml
Файл:
Docker/init.sql
Файл:
Docker/db.Dockerfile
Составление и запуск услуг:
источник
Я добавляю пользовательские команды в среду, вызванную в CMD после запуска служб ... Я не делал это с postgres, но с Oracle:
и начать с
,
источник
Вы можете использовать эту команду:
источник
ENCODING 'LATIN1'
очень странно ... Вы должны иметь особые потребности избегать использования utf8Прежде чем создавать пользователей, вам нужно запустить базу данных. Для этого вам нужно несколько процессов. Вы можете либо запустить postgres в подоболочке (&) в сценарии оболочки, либо использовать такой инструмент, как supervisord, чтобы запустить postgres, а затем запустить любые сценарии инициализации.
Руководство по диспетчеру и докеру https://docs.docker.com/articles/using_supervisord/
источник
С docker compose есть простая альтернатива (не нужно создавать Dockerfile). Просто создайте init-database.sh:
И сослаться на это в разделе томов:
источник