Docker中PostgreSQL升级后重启版本回退至11.9的求助
问题分析与解决方案
核心问题根源
你遇到的核心矛盾是容器的临时特性:在运行中的容器内手动安装的软件(如postgresql-12)仅存于容器的临时层,容器重启后会完全回到基础镜像(postgres:12)的初始状态。此外,你可能混淆了「容器内PostgreSQL服务版本」和「psql客户端版本」,或Django实际连接的并非容器内的postgres:12服务。
分步解决方案
1. 验证postgres:12官方镜像的正确性
官方postgres:12镜像自带完整的12.x版本PostgreSQL服务和客户端,无需手动安装。先清理缓存并重新拉取镜像:
# 删除现有镜像(若存在) docker rmi postgres:12 # 重新拉取官方镜像 docker pull postgres:12 # 启动临时容器验证版本 docker run --rm postgres:12 psql --version
正常输出应为psql (PostgreSQL) 12.x,若仍显示11.9,检查是否有本地镜像缓存污染,可添加--no-cache参数强制重新拉取。
2. 修正容器使用方式(推荐分离架构)
容器设计原则是单进程单服务,建议将PostgreSQL数据库和Django项目分为两个独立容器,用Docker Compose管理:
步骤1:创建docker-compose.yml文件
version: '3.8' services: db: image: postgres:12 environment: POSTGRES_PASSWORD: your_db_password # 替换为你的密码 volumes: - postgres_data:/var/lib/postgresql/data/ # 持久化数据库数据 ports: - "5432:5432" web: build: . # 基于当前目录的Dockerfile构建Django镜像 command: python manage.py runserver 0.0.0.0:8000 volumes: - .:/code # 挂载本地项目目录到容器 ports: - "8000:8000" depends_on: - db environment: - DB_HOST=db # 数据库服务名,对应上方的db容器 - DB_PASSWORD=your_db_password volumes: postgres_data:
步骤2:创建Django项目的Dockerfile
# 基于Python官方镜像 FROM python:3.9-slim WORKDIR /code # 安装依赖 COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt # 复制项目文件 COPY . .
步骤3:修改Django的settings.py数据库配置
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql', 'NAME': 'postgres', 'USER': 'postgres', 'PASSWORD': os.environ.get('DB_PASSWORD'), 'HOST': os.environ.get('DB_HOST'), 'PORT': '5432', } }
步骤4:启动服务
docker-compose up --build
之后在web容器内执行makemigrations和migrate即可:
docker-compose exec web python manage.py makemigrations docker-compose exec web python manage.py migrate
3. 若坚持单容器运行(不推荐)
如果必须在同一个容器内运行PostgreSQL和Django,需构建自定义镜像,将所有依赖打包进去:
FROM postgres:12 # 安装Python和Django依赖 RUN apt-get update && apt-get install -y --no-install-recommends \ python3 python3-pip \ && rm -rf /var/lib/apt/lists/* WORKDIR /code COPY requirements.txt . RUN pip3 install --no-cache-dir -r requirements.txt COPY . . # 添加启动脚本,同时启动PostgreSQL和Django(需用supervisord管理多进程) COPY start.sh /usr/local/bin/ RUN chmod +x /usr/local/bin/start.sh CMD ["start.sh"]
start.sh示例:
#!/bin/bash # 启动PostgreSQL service postgresql start # 等待数据库就绪 sleep 5 # 执行Django迁移并启动服务 python3 manage.py makemigrations python3 manage.py migrate python3 manage.py runserver 0.0.0.0:8000
针对当前异常状态的临时修复
若不想重新构建镜像,可先进入当前容器,检查Django实际连接的数据库地址:
# 进入容器 docker exec -it <your-container-id> bash # 查看DATABASES配置 cat /path/to/your/django/project/settings.py | grep -A 10 DATABASES
如果HOST配置为localhost但实际连接的是宿主机的PostgreSQL(版本11.9),需改为容器内的PostgreSQL服务地址,或关闭宿主机的PostgreSQL服务避免冲突。
内容的提问来源于stack exchange,提问作者Overstacked
相关产品推荐
相关产品推荐

