You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 13:41:21