集成Wagtail的Django项目迁移Docker后页面数据丢失求助
问题
按照Wagtail官方文档将Wagtail集成到现有Django项目后,迁移到Docker环境部署:已将SQL备份导入PostgreSQL,使用uWSGI运行无报错,但前端页面无内容,后台管理页也没有原有页面,需重新创建。
使用的命令:
docker-compose -f docker-compose-deploy.yml builddocker-compose -f docker-compose-deploy.yml updocker-compose -f docker-compose-deploy.yml run --rm app sh -c "python manage.py createsuperuser"
相关配置文件:
Dockerfile
FROM python:3.9-slim-bookworm LABEL maintainer="londonappdeveloper.com" ENV PYTHONUNBUFFERED=1 # Install dependencies RUN apt-get update && apt-get install --no-install-recommends -y \ build-essential \ libpq-dev \ gcc \ exiftool \ imagemagick \ libmagickwand-dev \ libmagic1 \ redis-tools \ && apt-get purge -y --auto-remove -o APT::AutoRemove::RecommendsImportant=false \ && rm -rf /var/lib/apt/lists/* # Set up virtual environment RUN python -m venv /py && \ /py/bin/pip install --upgrade pip # Copy application files COPY ./requirements.txt /requirements.txt COPY . /app COPY ./scripts /scripts WORKDIR /app EXPOSE 8000 # Install Python dependencies RUN /py/bin/pip install -r /requirements.txt # Set up directories for static and media files RUN adduser --disabled-password --no-create-home app && \ mkdir -p /vol/web/static && \ mkdir -p /vol/web/media && \ chown -R app:app /vol && \ chmod -R 755 /vol && \ chmod -R +x /scripts ENV PATH="/scripts:/py/bin:$PATH" USER app CMD ["run.sh"]
docker-compose-deploy.yml
version: '3.9' services: app: build: context: . restart: always volumes: - static-data:/vol/web environment: - DB_HOST=db - DB_NAME=${DB_NAME} - DB_USER=${DB_USER} - DB_PASS=${DB_PASS} - SECRET_KEY=${SECRET_KEY} - ALLOWED_HOSTS=${ALLOWED_HOSTS} - REDIS_URL=${REDIS_URL} depends_on: - db - redis links: - db:db - redis:redis db: image: postgres:13-alpine restart: always volumes: - postgres-data:/var/lib/postgresql/data environment: - POSTGRES_DB=${DB_NAME} - POSTGRES_USER=${DB_USER} - POSTGRES_PASSWORD=${DB_PASS} proxy: build: context: ./proxy restart: always depends_on: - app ports: - 80:8000 volumes: - static-data:/vol/static redis: image: redis:alpine volumes: postgres-data: static-data:
解决方案
1. 验证数据库备份是否正确导入
容器内的PostgreSQL使用独立卷postgres-data,需确认备份确实导入到该容器的数据库中:
- 进入PostgreSQL容器:
docker-compose -f docker-compose-deploy.yml exec db psql -U ${DB_USER} -d ${DB_NAME} - 查询Wagtail页面表数据量,确认是否有记录:
SELECT COUNT(*) FROM wagtailcore_page; - 如果结果为0,重新导入备份:
- 将本地备份文件拷贝到容器:
docker cp /path/to/your/backup.sql $(docker-compose -f docker-compose-deploy.yml ps -q db):/tmp/ - 进入容器执行导入:
docker-compose -f docker-compose-deploy.yml exec db psql -U ${DB_USER} -d ${DB_NAME} -f /tmp/backup.sql
- 将本地备份文件拷贝到容器:
2. 确保静态文件已正确收集
Wagtail后台和前端依赖静态文件,需确认容器启动时执行了collectstatic:
- 手动执行静态文件收集:
docker-compose -f docker-compose-deploy.yml run --rm app sh -c "python manage.py collectstatic --noinput" - 检查
run.sh脚本,确保包含上述命令,避免每次启动都需要手动执行。
3. 迁移媒体文件
如果原项目存在上传的媒体文件(图片、文档等),需将这些文件同步到容器的媒体目录:
- 将本地媒体文件拷贝到容器的
/vol/web/media目录:docker cp /path/to/local/media/ $(docker-compose -f docker-compose-deploy.yml ps -q app):/vol/web/media/ - 生产环境建议将本地媒体目录挂载到容器,或使用对象存储存储媒体文件。
4. 验证数据库连接配置
确认Django配置文件settings.py中的数据库设置正确读取环境变量:
import os DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql_psycopg2', 'NAME': os.environ.get('DB_NAME'), 'USER': os.environ.get('DB_USER'), 'PASSWORD': os.environ.get('DB_PASS'), 'HOST': os.environ.get('DB_HOST'), 'PORT': 5432, } }
同时检查wagtailcore_site表是否有站点记录,若缺失可从备份恢复或在后台手动创建。
5. 清除Redis缓存
Redis可能缓存了空数据,导致页面无法正常显示:
- 清除Redis缓存:
docker-compose -f docker-compose-deploy.yml exec redis redis-cli FLUSHALL - 重启app容器:
docker-compose -f docker-compose-deploy.yml restart app
内容的提问来源于stack exchange,提问作者Thehiddenguy
相关产品推荐
相关产品推荐

