я видел в документах и многих решениях для инициализации контейнера postgres с базой данных, используя init.sql, как упомянуто в этом вопросе :
COPY init.sql /docker-entrypoint-initdb.d/10-init.sql
Проблема заключается вчто данные моей базы данных в .sql
слишком велики (8 ГБ).Это делает процесс дампа длинным, а файл - тяжелым.Я пытался сделать что-то похожее на этот подход, генерируя файл .dump
с (540 МБ).
У меня есть 2 контейнера для запуска моего проекта django.Dockerfile для моей среды Python и изображения postgres.Мои файлы докера показаны в конце этого вопроса.До сих пор мне удалось запустить дамп в моем контейнере с помощью следующих шагов:
- Я добавляю свой
.dump
файл в свой контейнер в docker-compose - сборка моих контейнеров
- Зайдите в мой контейнер postgres и выполните команду
pg_restore
для выгрузки моей базы данных. - Затем перейдите в мой контейнер python / django, чтобы выполнить команду migrate.
- И, наконец,Запустите сервер.
Это работает, но не автоматизировано.Как я могу автоматизировать эту проблему в моих файлах докера, чтобы мне не нужно было выполнять эти команды вручную?
Ниже приведены мои файлы и команды, необходимые для запуска моего .dump
файла в контейнере postgres:
создать и добавить ./project-dump/latest.dump
в мой проект
docker-compose up -d web db #build containers
docker-compose exec db bash # go in my postgres container
pg_restore --verbose --clean --no-acl --no-owner -h {pg_container_name} -U postgres -d database_dev
exit # exit postgres container
docker-compose exec web bash # go in my python/django project container
./manage.py migrate # migrate database
./manage.py runserver 0.0.0.0:3000 #run server
Dockerfile:
FROM python:3.7.3-stretch
ENV PYTHONUNBUFFERED 1
RUN mkdir /code
WORKDIR /code
COPY requirements.txt /code/
RUN pip install -r requirements.txt
COPY . /code/
COPY init.sql /docker-entrypoint-initdb.d/10-init.sql
RUN python manage.py migrate
EXPOSE 3000
docker-compose.yaml
version: '3'
services:
db:
image: postgres
environment:
POSTGRES_USER: postgres
POSTGRES_DB: database_dev
POSTGRES_PASSWORD: secret
ports:
- "5432:5432"
volumes:
- ./project-dump/:/var/www/html
web:
build: .
command: python3 manage.py runserver 0.0.0.0:3000
volumes:
- .:/django-docker
ports:
- "3000:3000"
depends_on:
- db
init.sql
CREATE DATABASE database_dev;
GRANT ALL PRIVILEGES ON DATABASE database_dev TO postgres;