【问题标题】:Why does Django recreate the DB tables on each docker-container restart?为什么 Django 在每次 docker-container 重新启动时重新创建数据库表?
【发布时间】:2021-01-23 13:31:21
【问题描述】:

我在 docker-compose 设置中运行 Django 和 PostgreSQL 以进行开发。每次我重新启动应用程序容器时,数据库都是空的,即使我没有重新启动 DBMS 容器,也没有删除 DBMS 的数据量。似乎 Django 在重新启动时删除了所有表。为什么?

我的设置与here 的描述非常接近。也就是说,我的 compose 文件如下(简化):

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

【问题讨论】:

  • 简单的卷描述在这种情况下适用于我:volumes: - app-data:/var/lib/postgresql/data
  • @AndreyBorzenko,我更改了volumes 声明,但无济于事。我还将DB_MIGRATE 设置为false 并禁用了DEBUG 模式。尽管如此,当我在 app 容器上执行 docker-compose restart 时,数据库已经消失了。

标签: django postgresql docker-compose django-migrations drop-table


【解决方案1】:

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

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

  python manage.py flush --no-input

来自我的entrypoint.sh 脚本。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多