#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