为什么 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=trueDEBUG=1

Django flush 命令从数据库中删除所有数据,如 documentation 中所述。

因此,要解决我上面的问题,我只需要删除行

  python manage.py flush --no-input

来自我的 entrypoint.sh 脚本。

解释:我认为 - 错误地 - flush 会提交任何可能仍从其他可能使用该数据库的应用程序打开的未决事务。不是这种情况。相反,flush 只是删除所有数据。