Моя база данных postgresql не сохраняется между запусками docker
Я изучаю docker и postgresql, и у меня возникла проблема с сохранением данных между повторными запусками приложения.
Мой docker-compose.yml:
version: '3.7'
services:
web:
build: .
command: python3 /code/manage.py runserver 0.0.0.0:8000
volumes:
- .:/code
ports:
- 8000:8000
depends_on:
- db
db:
image: postgres:15
volumes:
- postgres_data:/var/lib/postgresql/data
environment:
POSTGRES_PASSWORD: postgres
ports:
- "5432:5432"
volumes:
postgres_data:
external: true
Я запускаю свой проект с docker-compose up -d
, перехожу к docker-compose exec web python3 manage.py migrate
, но после перехода к docker-compose down
и запуска контейнеров мне снова приходится мигрировать. Это очень беспокоит. Кто-нибудь может помочь, пожалуйста?
Проблема, с которой вы столкнулись, связана с тем, что данные вашей базы данных не сохраняются между запусками ваших контейнеров Docker. Это происходит потому, что том, в котором хранятся данные PostgreSQL, удаляется при выполнении команды docker-compose
down.
Команда docker-compose
down останавливает и удаляет контейнеры, сети и, что особенно важно, тома, определенные в вашем файле docker-compose.yml
. Поскольку данные PostgreSQL хранятся в томе, при выполнении команды docker-compose down
эти данные будут удалены.
Чтобы сохранить данные PostgreSQL между запусками, следует использовать команду docker-compose down
с флагом --volumes
или -v
. Это позволит сохранить ваши тома, а значит и данные PostgreSQL, между запусками. Ваша команда должна выглядеть следующим образом: docker-compose down --volumes
.
Альтернативный вариант - использовать команду docker-compose stop
, когда нужно остановить контейнеры Docker, не удаляя тома. Когда вы будете готовы снова запустить свои контейнеры, вы можете использовать команду docker-compose start
.
Сохранив тома с помощью docker-compose down --volumes
или остановив контейнеры с помощью docker-compose stop
, ваши данные PostgreSQL будут сохраняться между запусками, избавляя вас от необходимости переносить базу данных каждый раз, когда вы
volumes:
postgres_data:
external: true
Знаете ли вы, что это делает? Насколько я знаю, если вы создадите том с помощью команды: docker volume create
, вы можете ссылаться на него в своем компе. Так что если вы не знаете, как его использовать, это и вызывает проблему. Как я полагаю, вы не создали том.
Поэтому, чтобы все работало правильно, просто удалите строку external: true
и позвольте docker управлять вашим томом. И до тех пор, пока вы не используете docker compose down --volumes
, ваши данные будут сохраняться.