使用python-slim镜像遇到无法使用PostgreSQL的问题

前言

之前不是把 DjangoStarter 的 docker 方案重新搞好了吗

一开始demo部署是使用 SQLite 数据库的,用着没问题,但很快切换到 PostgreSQL 的时候就遇到问题了...

报错

docker 启动之后,app 容器报错

python 复制代码
django.core.exceptions.ImproperlyConfigured: Error loading psycopg2 or psycopg module

排错

一开始我还以为是 psycopg2 库装不上,或者是在 python_builder 阶段的依赖没有正确复制到 final 阶段的容器,但后面改了几个地方,重新试了一下都不行。

接下来使用 python src/manage.py shell 进入 shell,测试一下能否导入 psycopg2

python 复制代码
>>> import psycopg2
Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "/project/.venv/lib/python3.11/site-packages/psycopg2/__init__.py", line 51, in <module>
    from psycopg2._psycopg import (                     # noqa
ImportError: libpq.so.5: cannot open shared object file: No such file or directory

好的,经常被 docker 坑的人应该已经看出问题出在系统环境上了

不使用 slim 镜像换成普通的 python 镜像就正常了...

解决

OK,既然找出问题原因,那么就可以来着手解决了。

使用 psycopg2-binary

最简单的方法就是将 psycopg2 库换成 psycopg2-binary,这是一个预编译的 psycopg2 包,不需要编译环境,安装更简便。

手动安装 libpq 库

既然缺了 libpq 库,那就在 docker 镜像里安装。

这个方法我还没测试,又麻烦又不优雅

dockerfile 复制代码
# 使用 Python 3.11 slim 基础镜像
FROM python:3.11-slim

# 安装 psycopg2 依赖
RUN apt-get update && apt-get install -y \
    libpq-dev \
    gcc \
    # 清理缓存以减少镜像大小
    && apt-get clean \
    && rm -rf /var/lib/apt/lists/*

不同的python基础镜像

python镜像基于 Debian 系统,默认是用 Debian 的最新稳定版,也可以自己指定版本,比如 python3.11-slim-bookworm 就是指定用 Debian 12 ("bookworm") 作为基础镜像

  • python3.11-slim-bookworm 基础镜像打包出来的镜像大小是424MB,python3.11-slim 打包出来也是这个大小
  • 使用 python3.11 基础镜像打包出来就到 1.3G 了,大小直接翻了几倍

还可以选择 alpine 镜像,不过可能会遇到更多兼容性问题,我就不折腾了,心累。

小结

一般选 slim 镜像还是可以的,基于 Debian 不怎么需要担心兼容性问题

偶尔遇到小问题还是比较好解决的

alpine 镜像不一样的地方就很多了,太折腾了...

相关推荐
喵手1 分钟前
Python爬虫实战:公共自行车站点智能采集系统 - 从零构建生产级爬虫的完整实战(附CSV导出 + SQLite持久化存储)!
爬虫·python·爬虫实战·零基础python爬虫教学·采集公共自行车站点·公共自行车站点智能采集系统·采集公共自行车站点导出csv
喵手9 分钟前
Python爬虫实战:地图 POI + 行政区反查实战 - 商圈热力数据准备完整方案(附CSV导出 + SQLite持久化存储)!
爬虫·python·爬虫实战·零基础python爬虫教学·地区poi·行政区反查·商圈热力数据采集
熊猫_豆豆14 分钟前
YOLOP车道检测
人工智能·python·算法
nimadan1215 分钟前
**热门短剧小说扫榜工具2025推荐,精准捕捉爆款趋势与流量
人工智能·python
默默前行的虫虫20 分钟前
MQTT.fx实际操作
python
YMWM_30 分钟前
python3继承使用
开发语言·python
JMchen12330 分钟前
AI编程与软件工程的学科融合:构建新一代智能驱动开发方法学
驱动开发·python·软件工程·ai编程
说实话起个名字真难啊35 分钟前
用docker来安装openclaw
docker·ai·容器
恬静的小魔龙1 小时前
【群晖Nas】群晖Nas中实现SVN Server功能、Docker/ContainerManager等
docker·svn·容器
亓才孓1 小时前
[Class类的应用]反射的理解
开发语言·python