为什么 Django 在每个 docker-container 重启时重新创建数据库表?
Why does Django recreate the DB tables on each docker-container restart?
我是 运行 Django 和 PostgreSQL 在 docker-compose 开发设置中。每次我重新启动应用程序容器时,数据库都是空的,即使我既没有重新启动 DBMS 容器也没有删除 DBMS 的数据量。似乎 Django 在重新启动时删除了所有表。为什么?
我的设置非常符合描述here。也就是说,我的撰写文件如下所示(简化):
version: '3.8'
services:
db:
image: postgres
environment:
- POSTGRES_DB=db_dev
- POSTGRES_USER=dev
- POSTGRES_PASSWORD=postgres
volumes:
- type: volume
source: app-data
target: /var/lib/postgresql/data
app:
build: .
command: python manage.py runserver 0.0.0.0:8888
container_name: app
environment:
- DATABASE_URL
- PYTHONDONTWRITEBYTECODE=1
- PYTHONUNBUFFERED=1
volumes:
# Mount the local source code folder for quick iterations.
# See: https://www.docker.com/blog/containerized-python-development-part-3/
- type: bind
source: .
target: /code
ports:
- target: 8888
published: 8888
depends_on:
- db
env_file:
- ./dev.env
volumes:
app-data:
external: true
Django 应用程序是通过 entrypoint.sh
:
启动的
#! /bin/sh
if [ "$DATABASE" = "postgresql" ]
then
echo "Waiting for postgres..."
while ! nc -z $SQL_HOST $SQL_PORT; do
sleep 0.1
done
echo "PostgreSQL started"
fi
doMigrate=${DB_MIGRATE:-false}
if [ "$doMigrate" = true ] ;
then
python manage.py flush --no-input
python manage.py migrate
fi
exec "$@"
在开发设置中,我设置了DB_MIGRATE=true
和DEBUG=1
。
Django flush
命令从数据库中删除所有数据,如 documentation 中所述。
因此,要解决我上面的问题,我只需要删除行
python manage.py flush --no-input
来自我的 entrypoint.sh
脚本。
解释:我认为 - 错误地 - flush
会提交任何可能仍从其他可能使用该数据库的应用程序打开的未决事务。不是这种情况。相反,flush
只是删除所有数据。
我是 运行 Django 和 PostgreSQL 在 docker-compose 开发设置中。每次我重新启动应用程序容器时,数据库都是空的,即使我既没有重新启动 DBMS 容器也没有删除 DBMS 的数据量。似乎 Django 在重新启动时删除了所有表。为什么?
我的设置非常符合描述here。也就是说,我的撰写文件如下所示(简化):
version: '3.8'
services:
db:
image: postgres
environment:
- POSTGRES_DB=db_dev
- POSTGRES_USER=dev
- POSTGRES_PASSWORD=postgres
volumes:
- type: volume
source: app-data
target: /var/lib/postgresql/data
app:
build: .
command: python manage.py runserver 0.0.0.0:8888
container_name: app
environment:
- DATABASE_URL
- PYTHONDONTWRITEBYTECODE=1
- PYTHONUNBUFFERED=1
volumes:
# Mount the local source code folder for quick iterations.
# See: https://www.docker.com/blog/containerized-python-development-part-3/
- type: bind
source: .
target: /code
ports:
- target: 8888
published: 8888
depends_on:
- db
env_file:
- ./dev.env
volumes:
app-data:
external: true
Django 应用程序是通过 entrypoint.sh
:
#! /bin/sh
if [ "$DATABASE" = "postgresql" ]
then
echo "Waiting for postgres..."
while ! nc -z $SQL_HOST $SQL_PORT; do
sleep 0.1
done
echo "PostgreSQL started"
fi
doMigrate=${DB_MIGRATE:-false}
if [ "$doMigrate" = true ] ;
then
python manage.py flush --no-input
python manage.py migrate
fi
exec "$@"
在开发设置中,我设置了DB_MIGRATE=true
和DEBUG=1
。
Django flush
命令从数据库中删除所有数据,如 documentation 中所述。
因此,要解决我上面的问题,我只需要删除行
python manage.py flush --no-input
来自我的 entrypoint.sh
脚本。
解释:我认为 - 错误地 - flush
会提交任何可能仍从其他可能使用该数据库的应用程序打开的未决事务。不是这种情况。相反,flush
只是删除所有数据。