Почему данные сохраняются при использовании 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 ... и вы получите первозданные контейнеры при каждом запуске.

Другие вопросы по тегам