Построить контейнер докеры postgres с начальной схемой
Я хочу создать докеры, которые представляют уже существующие базы данных компаний. Аналогично, я хотел бы создать файл докеров, который начинается с восстановления дампа psql.
У меня есть psql_dump.sql
в каталоге .
.
FROM postgres
ADD . /init_data
run "createdb" "--template=template0" "my_database"
run "psql" "-d" "my_database" --command="create role my_admin superuser"
run "psql" "my_database" "<" "init_data/psql_dump.sql"
Я думал, что это будет достаточно хорошо, чтобы это сделать. Я бы хотел избежать решений, использующих .sh
script. Как это решение.
Я использую template0, так как в документации psql вам нужны те же самые пользователи, которые были в исходной базе данных, и вам нужно создать базу данных с шаблоном0 до восстановления.
Однако это дает мне ошибку:
createdb: could not connect to database template1: could not connect to server: No such file or directory
Is the server running locally and accepting
Я также использую docker compose для общего приложения, если лучше решить эту проблему в docker-compose, я был бы рад использовать базовое изображение psql и использовать компоновку docker для этого.
Ответы
Ответ 1
В соответствии с руководство по использованию для официального изображения Docker PostreSQL, все, что вам нужно, это:
Dockerfile
FROM postgres
ENV POSTGRES_DB my_database
COPY psql_dump.sql /docker-entrypoint-initdb.d/
Переменная среды POSTGRES_DB
даст указание контейнеру создать схему my_database
при первом запуске.
И будет выполнен любой .sql
файл, найденный в /docker-entrypoint-initdb.d/
контейнера.
Если вы хотите выполнить скрипты .sh
, вы также можете предоставить их в каталоге /docker-entrypoint-initdb.d/
.
Ответ 2
Как сказано в комментариях, @Thomasleveil ответ велик и прост, если ваша схема отдыха быстро.
Но в моем случае это медленно, и я хотел использовать объемы докеров, поэтому вот что я сделал
- Сначала используйте изображение докеров, как в @Thomasleveil, чтобы создать контейнер с postgres со всей инициализацией схемы.
Dockerfile:
FROM postgres
WORKDIR /docker-entrypoint-initdb.d
ADD psql_dump.sql /docker-entrypoint-initdb.d
EXPOSE 5432
-
затем запустите его и создайте новый локальный каталог, содержащий данные postgres после его заполнения из файла psql_dump.sql: docker cp mypg:/var/lib/postgresql/data ./postgres-data
-
Скопируйте данные в папку временных данных и запустите новый контейнер postgres docker-compose, том которого находится в новой папке данных temp:
startPostgres.sh:
rm -r ./temp-postgres-data/data
mkdir -p ./temp-postgres-data/data
cp -r ./postgres-data/data ./temp-postgres-data/
docker-compose -p mini-postgres-project up
и файл docker-compose.yml:
version: '3'
services:
postgres:
container_name: mini-postgres
image: postgres:9.5
ports:
- "5432:5432"
volumes:
- ./temp-postgres-data/data:/var/lib/postgresql/data
Теперь вы можете запускать шаги №1 и №2 на новом компьютере или изменить свой psql_dump.sql. И каждый раз, когда вам нужен новый чистый (но уже инициализированный) db, вы можете запускать startPostgres.sh только с шага №3.
И он все еще использует объемы докеров.