Подтвердить что ты не робот

Построить контейнер докеры 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 для этого.

4b9b3361

Ответ 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
  1. затем запустите его и создайте новый локальный каталог, содержащий данные postgres после его заполнения из файла psql_dump.sql: docker cp mypg:/var/lib/postgresql/data ./postgres-data

  2. Скопируйте данные в папку временных данных и запустите новый контейнер 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. И он все еще использует объемы докеров.