Хотите поделиться файлом резервной копии в веб-контейнере Django с контейнером базы данных Postgres: Как это сделать?

#django #postgresql #docker

#django #postgresql #docker

Вопрос:

РЕДАКТИРОВАТЬ 2

На самом деле я понял, что автоматическое резервное копирование, выполненное сегодня в среде preprod (nginx) с помощью celery / dbbackup, недоступно в контейнере?

У меня есть резервная копия только со вчерашнего дня, когда я использую среду разработки (django runserver)….


РЕДАКТИРОВАТЬ 1

изменить docker-скомпоновать соответственно backup_volume смонтирован, я не могу найти, где в локальном, но если я подключусь к контейнеру БД и выполню i ‘path/to/file.psql’, это сработает

 [
    {
        "CreatedAt": "2021-01-19T14:37:55Z",
        "Driver": "local",
        "Labels": {
            "com.docker.compose.project": "cafe_tropical",
            "com.docker.compose.version": "1.27.4",
            "com.docker.compose.volume": "backup_volume"
        },
        "Mountpoint": "/var/lib/docker/volumes/cafe_tropical_backup_volume/_data",
        "Name": "cafe_tropical_backup_volume",
        "Options": null,
        "Scope": "local"
    }
]
 

У меня есть приложение Django в Docker с веб-контейнером, в котором хранятся автоматические резервные копии, и другим контейнером базы данных postgresql.

Я хочу иметь возможность восстановить базу данных postgresql, используя i ‘pathtobackup.psql’ в оболочке psql, но это не удалось, потому что файл не найден

 db_preprod=# i '/usr/src/app/backup/backup_2021-01-19_1336.psql'
/usr/src/app/backup/backup_2021-01-19_1336.psql: No such file or directory
 

Я также пытался скопировать с помощью docker cp, но не работает:

 docker cp web:/usr/src/ap/backup/backup_2021-01-19_1336.psql db:/.
copying between containers is not supported
 

docker-compose

 version: '3.7'

services:
    web:
        restart: always
        container_name: web
        build: 
            context: ./app
            dockerfile: Dockerfile.preprod
        restart: always
        command: gunicorn core.wsgi:application --bind 0.0.0.0:8000
        volumes:
            - ./app:/usr/src/app
            - static_volume:/usr/src/app/static
            - media_volume:/usr/src/app/media
            - backup_volume:/usr/src/app/backup         <-- added volume
        expose:
            - 8000
        env_file:
            - ./.env.preprod
        depends_on:
            - db
            - redis
        healthcheck:
            test: ["CMD", "curl", "-f", "http://localhost:8000/"]
            interval: 30s
            timeout: 10s
            retries: 50         
          
    db:
        container_name: db
        image: postgres:12.0-alpine
        volumes:
            - postgres_data:/var/lib/postgresql/data/
            - backup_volume:/var/lib/postgresql/data/backup  <-- added volume
        env_file:
            - ./.env.preprod.db
   
    nginx:
        container_name: nginx
        build: ./nginx
        restart: always
        volumes:
            - static_volume:/usr/src/app/static
            - media_volume:/usr/src/app/media
        ports:
            - 1340:80
        depends_on:
            web:
                condition: service_healthy

volumes:
    postgres_data:
    static_volume:
    media_volume:
    backup_volume:

 

Ответ №1:

Вам нужно использовать тома. Оба контейнера монтируют один и тот же путь. Django выводит дамп, а затем его получает psql. Но почему это так работает? Разве вы не должны иметь возможность выводить и восстанавливать данные либо из django, либо из postgres?

Комментарии:

1. спасибо за ответ. Возможно, это неправильный способ, но я использую приложение django dbbackup и Celey / Celery-beats для автоматического резервного копирования БД. И это работает. Но вы правы, первое, что я попытался сделать, это ‘dumpdata’, но я не знаю, почему это не сработало, а файлы json были неверными и не могли использоваться для loaddata

2. Конечно, никаких проблем — просто любопытно. Проверьте это: docs.djangoproject.com/en/3.1/topics/serialization / … это помогло мне преодолеть проблемы, подобные той, которая была у вас с dumpdata