Postgresql Docker在我关闭后端容器时丢失Postgres服务器数据
我有下面的docker compose文件,它在端口80上提供应用程序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:
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