Postgresql Docker在我关闭后端容器时丢失Postgres服务器数据

Postgresql Docker在我关闭后端容器时丢失Postgres服务器数据,postgresql,docker,docker-compose,Postgresql,Docker,Docker Compose,我有下面的docker compose文件,它在端口80上提供应用程序 version: '3' services: backend: build: ./Django-Backend command: gunicorn testing.wsgi:application --bind 0.0.0.0:8000 --log-level debug expose: - "8000" volumes:

我有下面的docker compose文件,它在端口80上提供应用程序

version: '3'

services:
    backend:
        build: ./Django-Backend
        command: gunicorn testing.wsgi:application --bind 0.0.0.0:8000 --log-level debug
        expose:
            - "8000"
        volumes:
            - static:/code/backend/static
        env_file:
            - ./.env.prod

    nginx:
        build: ./nginx
        ports:
            - 80:80
        volumes:
            - static:/static
        depends_on:
            - backend

    db:
        image: postgres
        environment:
            - POSTGRES_DB=postgres
            - POSTGRES_USER=postgres
            - POSTGRES_PASSWORD=postgres
        volumes:
            - postgres_data:/var/lib/postgresql/data/

volumes:
    static:
    postgres_data:
一旦在那里,我可以登录到管理员,并添加一个额外的用户,该用户会被保存到数据库中,因为我可以重新加载页面,用户仍然在那里。一旦我停止后端docker容器,该用户就消失了。鉴于Postgres在另一个容器中运行,并且我没有关闭它,我不确定停止后端容器并重新启动它是如何导致数据不可用的

提前谢谢

编辑: 我使用以下命令打开docker容器

docker-compose -f docker-compose.prod.yml up -d
我只是使用docker desktop并停止容器,从而使容器停止运行

if [ "$DATABASE" = "postgres" ]
then
    echo "Waiting for postgres..."

    while ! nc -z $SQL_HOST $SQL_PORT; do
      sleep 0.1
    done

    echo "PostgreSQL started"
fi
我正在为后端运行DJANGO 3,还尝试在容器运行时在终端中添加超级用户:

# python manage.py createsuperuser 
Username (leave blank to use 'root'): mikey
Email address: 
Password: 
Password (again): 
This password is too common.
Bypass password validation and create user anyway? [y/N]: y
Superuser created successfully.
当容器运行时,它会工作并且用户会出现。然而,当我再次通过docker desktop关闭容器,然后重新启动它时,刚刚创建的用户消失了

进一步编辑:

settings.py使用dotenv“从dotenv导入加载\u dotenv”

.env.prod文件具有以下值:

DEBUG=0
DJANGO_ALLOWED_HOSTS=localhost 127.0.0.1 [::1]
SQL_ENGINE=django.db.backends.postgresql
SQL_DATABASE=postgres
SQL_USER=postgres
SQL_PASSWORD=postgres
SQL_HOST=db
SQL_PORT=5432
解决方案:

阅读注释以查看其他图例的诊断,但更新的docker compose文件如下所示。注意“依赖”块

最终编辑:

在我的entrypoint.sh文件中添加了以下代码,以确保Postgres准备好接受后端容器的连接

if [ "$DATABASE" = "postgres" ]
then
    echo "Waiting for postgres..."

    while ! nc -z $SQL_HOST $SQL_PORT; do
      sleep 0.1
    done

    echo "PostgreSQL started"
fi

能否添加用于关闭后端容器的命令?一般来说,请提供更多关于您所遵循的确切流程的信息,不要添加更多细节。希望帮助显示您是否正在连接到
settings.py中的数据库?它是连接到
postgres
本身还是使用默认的
sqlite3
db?添加了进一步的编辑以帮助解决问题。它通过.env.prod文件使用Postgres数据库。您可以从
db
容器中公开Postgres端口,并将其映射到主机的某个端口吗。然后使用pgAdmin或postico应用程序(如果您在mac中)连接到数据库,并验证数据是否确实已创建。我对此持怀疑态度,因为在docker compose文件中,
后端
没有
依赖
块,django可能会退回到
sqlite3
是否可以添加用于关闭后端容器的命令?一般来说,请提供更多关于您所遵循的确切流程的信息,不要添加更多细节。希望帮助显示您是否正在连接到
settings.py中的数据库?它是连接到
postgres
本身还是使用默认的
sqlite3
db?添加了进一步的编辑以帮助解决问题。它通过.env.prod文件使用Postgres数据库。您可以从
db
容器中公开Postgres端口,并将其映射到主机的某个端口吗。然后使用pgAdmin或postico应用程序(如果您在mac中)连接到数据库,并验证数据是否确实已创建。我对此持怀疑态度,因为在docker compose文件中,
后端没有
依赖块,django可能会退回到
sqlite3
if [ "$DATABASE" = "postgres" ]
then
    echo "Waiting for postgres..."

    while ! nc -z $SQL_HOST $SQL_PORT; do
      sleep 0.1
    done

    echo "PostgreSQL started"
fi