Почему данные сохраняются при использовании Postgres Docker image и docker-compose? - PullRequest
0 голосов
/ 23 января 2019

Я новичок в 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 Ответ

0 голосов
/ 23 января 2019

Вы должны различать остановку контейнера и удаление контейнера.

Сначала происходит, когда основной процесс в контейнере останавливает выполнение (возможно, из-за того, что вы вручную отправили сигнал остановки). В этом случае контейнер все еще доступен и может быть перезапущен со всеми данными, сохраненными в нем. Это то, что происходит в вашем примере.

Второе происходит при явном удалении контейнера. Это можно сделать с помощью специальной команды или с помощью аргумента удаления (например, docker run --rm ...), применяемого при запуске. В этом случае данные контейнера теряются.

docker-compose по умолчанию не удаляет контейнеры и перезапускает их. Чтобы изменить поведение, просто используйте docker-compose up --force-recreate ..., и вы получите чистые контейнеры при каждом запуске.

...