Windows环境下Docker部署Django:PostgreSQL本地数据无法在容器显示
在Windows系统中使用Docker部署Django应用,搭配PostgreSQL 14与PgAdmin4,并为Docker创建了专用服务器。目前遇到的问题是:PostgreSQL容器日志显示已检测到数据库目录存在数据并跳过初始化,但Django应用中无法看到本地的超级用户及数据。
以下是相关配置与日志信息:
PostgreSQL容器日志
2022-07-16 19:39:23.655 UTC [1] LOG: starting PostgreSQL 14.4 (Debian 14.4-1.pgdg110+1) on x86_64-pc-linux-gnu, compiled by gcc (Debian 10.2.1-6) 10.2.1 20210110, 64-bit 2022-07-16 19:39:23.673 UTC [1] LOG: listening on IPv4 address "0.0.0.0", port 5432 2022-07-16 19:39:23.673 UTC [1] LOG: listening on IPv6 address "::", port 5432 2022-07-16 19:39:23.716 UTC [1] LOG: listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432" 2022-07-16 19:39:23.854 UTC [26] LOG: database system was shut down at 2022-07-16 16:50:47 UTC 2022-07-16 19:39:23.952 UTC [1] LOG: database system is ready to accept connections PostgreSQL Database directory appears to contain a database; Skipping initialization
Django应用容器日志(无迁移可执行)
0 static files copied to '/app/static', 9704 unmodified. Operations to perform: Apply all migrations: admin, auth, contenttypes, controle, sessions Running migrations: No migrations to apply. Performing system checks... System check identified no issues (0 silenced). July 16, 2022 - 16:40:38 Django version 4.0.6, using settings 'setup.settings' Starting development server at http://0.0.0.0:8000/ Quit the server with CONTROL-C.
更新后的docker-compose配置
services: db: image: postgres volumes: - ./data/db:/var/lib/postgresql/data networks: - django_net environment: - POSTGRES_DB=${POSTGRES_DB} - POSTGRES_USER = ${POSTGRES_USER} - POSTGRES_PASSWORD = ${POSTGRES_PASSWORD} ports: - "5432:5432" web: build: . command: > sh -c "python manage.py collectstatic --noinput && python manage.py migrate && python manage.py runserver 0.0.0.0:8000" volumes: - .:/app ports: - "8000:8000" depends_on: - db links: - db environment: - POSTGRES_NAME=${POSTGRES_NAME:-djangodb} - POSTGRES_USER=${POSTGRES_USER:-postgre} - POSTGRES_PASSWORD=${POSTGRES_PASSWORD:-postgre} networks: - django_net networks: django_net: driver: bridge
更新后的.env文件
SECRET_KEY='django-insecure-1l2oh_bda$@s0w%d!@qyq8-09sn*8)6u-^wb(hx03==(vjk16h' POSTGRES_NAME=postgres POSTGRES_USER=postgres POSTGRES_PASSWORD=mypass POSTGRES_DB=mydb DJANGO_ALLOWED_HOSTS=localhost 127.0.0.1 [::1]
settings.py中的数据库配置
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql', 'NAME': os.environ.get('POSTGRES_NAME'), 'USER': os.environ.get('POSTGRES_USER'), 'PASSWORD': os.environ.get('POSTGRES_PASSWORD'), 'HOST': 'db', 'PORT': 5432, } }
已附上PgAdmin中的数据库数据截图和应用界面截图,请问遗漏了哪些配置?
环境变量格式错误
docker-compose中db服务的环境变量存在空格:POSTGRES_USER = ${POSTGRES_USER}和POSTGRES_PASSWORD = ${POSTGRES_PASSWORD},等号两侧的空格会导致变量无法正确读取,PostgreSQL会使用默认值(用户postgres,无密码)。需要去掉空格,改为:- POSTGRES_USER=${POSTGRES_USER} - POSTGRES_PASSWORD=${POSTGRES_PASSWORD}数据库名称不匹配
.env文件中POSTGRES_NAME=postgres(Django连接的库名),而POSTGRES_DB=mydb(PostgreSQL初始化时创建的库名),两者不一致。Django连接的是postgres库,但你本地的数据可能在mydb库中。需要统一两者:- 要么修改.env中的
POSTGRES_NAME=mydb,让Django连接到初始化的mydb库; - 要么修改.env中的
POSTGRES_DB=postgres,让PostgreSQL初始化时创建postgres库。
- 要么修改.env中的
数据库目录已有旧数据干扰
PostgreSQL容器的./data/db卷中已有旧数据库数据,可能不是你期望的包含本地超级用户的数据库。可以尝试:- 停止并删除容器:
docker-compose down -v(-v会删除卷数据); - 清理本地
./data/db目录; - 重新启动容器:
docker-compose up --build,让PostgreSQL重新初始化数据库。
- 停止并删除容器:
确认Django是否连接到正确的数据库
进入Django容器执行命令,验证数据库连接:docker-compose exec web python manage.py dbshell进入数据库后,执行
\l查看所有库,确认当前连接的库是否包含你的数据;执行\dt查看表,确认是否有auth_user等用户表及数据。超级用户未创建或未在当前数据库
如果数据库中没有超级用户,需要在Django容器中创建:docker-compose exec web python manage.py createsuperuser注意创建时要确保连接的是正确的数据库。
内容的提问来源于stack exchange,提问作者Marrows

