Почему данные сохраняются при использовании Postgres Docker image и docker-compose?
Я новичок в Docker и пытаюсь заставить приложение Django работать в контейнере Docker. Это приложение нуждается в базе данных PostgreSQL (и Redis).
Чтобы попробовать это, я создал образ (Dockerfile) для своего приложения и использовал основные postgres
образ для сервера базы данных. Мой файл docker-compose выглядит так:
version: '3.7'
services:
db:
image: postgres
redis:
image: redis
api:
build: .
command: python3 manage.py runserver 0.0.0.0:8000
environment:
- DJANGO_SETTINGS_MODULE=api.settings.docker_settings
volumes:
- ./api:/code/api
ports:
- "8000:8000"
depends_on:
- db
- redis
Поскольку мой файл docker-compose не определяет какой-либо том для базы данных, я ожидал, что данные базы данных будут потеряны при остановке контейнера, но это не так! То есть если я бегу docker-compose up
, добавьте данные в базу данных, остановите docker-compose и запустите его снова, данные все еще там!
Том автоматически создается в Docker? (Я заметил VOLUME
команда в Dockerfile postgres
изображение, см. здесь).
Теперь я хотел бы добавить том в docker-compose для хранения базы данных, где я могу управлять. Как я могу это сделать? Я думал, что я должен изменить файл docker-compose на
...
db:
image: postgres
volumes:
- ./postgres_data:/var/lib/postgresql/data
...
но как я могу сказать Docker не использовать предыдущие данные, которые были автоматически сохранены?
1 ответ
Вы должны различать остановку контейнера и удаление контейнера.
Сначала происходит, когда основной процесс в контейнере останавливает выполнение (возможно, потому что вы вручную отправили сигнал остановки). В этом случае контейнер все еще доступен и может быть перезапущен со всеми данными, сохраненными в нем. Это то, что происходит в вашем примере.
Второе происходит, когда вы явно удаляете контейнер. Это можно сделать с помощью специальной команды или с аргументом удаления (например, docker run --rm ...
) применяется на старте. В этом случае данные контейнера теряются.
docker-compose
по умолчанию не удаляет контейнеры и перезапускает их. Чтобы изменить поведение, просто используйте docker-compose up --force-recreate ...
и вы получите первозданные контейнеры при каждом запуске.