使用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 镜像不一样的地方就很多了,太折腾了...

相关推荐
卷无止境12 分钟前
《Deep Analysis with Polars》进阶分析技巧——深入解读
后端·python
大博士.J15 分钟前
视频号主体违规与认证上限?正确的解决方式
运维·python·自动化
Mr.朱鹏27 分钟前
【FastAPI 全栈实战 | 第2篇】Pydantic 数据校验与响应模型 —— 让 Bug 死在请求进来的那一刻
人工智能·python·fastapi
Xiangchu_39 分钟前
安徽硅胶厂的转型困局:从家电到汽车,卡在哪
经验分享·python·阿里云·eclipse·汽车·制造
CTA终结者1 小时前
近期AI量化工具推荐,围绕最难推进的环节选择
人工智能·python
谙忆1 小时前
Python 常用图像处理库速查:Pillow、OpenCV、rembg、pillow-simd 各擅长什么、怎么选
图像处理·python·pillow
敲代码的猴先生1 小时前
论文分享 | TensorAbuse:通过滥用TensorFlow API将AI模型转化为恶意软件
人工智能·python·语言模型·tensorflow·论文笔记
言乐61 小时前
Python视频相对亮度检测
数据库·python·计算机视觉·小程序·音视频
Csvn1 小时前
Python 开发技巧 · logging 最佳实践 —— 告别 print,搭建工程级日志系统
后端·python
ShallWeL1 小时前
【机器学习】(16)—— 数值数据
人工智能·python·算法·机器学习·数据分析