我有以下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桌面并停止容器来放下容器。
我正在为后端运行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桌面关闭容器然后重新启动容器时,刚创建的用户就消失了。
进一步编辑:
settings.py使用dotenv“从dotenv导入load_dotenv”
DATABASES = {
"default": {
"ENGINE": os.getenv("SQL_ENGINE"),
"NAME": os.getenv("SQL_DATABASE"),
"USER": os.getenv("SQL_USER"),
"PASSWORD": os.getenv("SQL_PASSWORD"),
"HOST": os.getenv("SQL_HOST"),
"PORT": os.getenv("SQL_PORT"),
}
}
.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文件如下所示。请注意“ depends_on”块。
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
depends_on:
- db
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/
expose:
- "5432"
volumes:
static:
postgres_data:
最终编辑:
将以下代码添加到我的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