使用python-slim镜像遇到无法使用PostgreSQL的问题
python-slim镜像用PostgreSQL?报错libpq.so.5缺失,谁在乎?换psycopg2-binary搞定,或者手动安装库,麻烦死了。slim镜像小,PostgreSQL却不行,缺库谁管?用预编译包省事点。
目录8 个章节
前言
之前不是把 DjangoStarter 的 docker 方案重新搞好了吗
一开始demo部署是使用 SQLite 数据库的,用着没问题,但很快切换到 PostgreSQL 的时候就遇到问题了…
报错
docker 启动之后,app 容器报错
django.core.exceptions.ImproperlyConfigured: Error loading psycopg2 or psycopg module
排错
一开始我还以为是 psycopg2 库装不上,或者是在 python_builder 阶段的依赖没有正确复制到 final 阶段的容器,但后面改了几个地方,重新试了一下都不行。
接下来使用 python src/manage.py shell 进入 shell,测试一下能否导入 psycopg2 库
>>> 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 镜像里安装。
这个方法我还没测试,又麻烦又不优雅
# 使用 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 镜像不一样的地方就很多了,太折腾了…
_EOF_
使用python-slim镜像遇到无法使用PostgreSQL的问题
- 本文作者:
- 程序设计实验室
- 版权声明:
- 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
相关文章
在python项目的docker镜像里使用pdm管理依赖
PDM在Docker里替代pip?改Dockerfile调compose,禁用虚拟环境设路径,uwsgi要gcc镜像slim不行。PDM比poetry顺,勉强能用。
2024-08-11 · docker · 约 1 分钟
一次生产环境的docker MySQL故障
问题 昨天下午本来要去吃下午茶,然后前端小伙伴突然说接口怎么崩了,我登上sentry一看,报错了 (2005, Unknown MySQL server host 'mysql' (-3)) 啥意思啊,连不上数据库,host是mysql因为这是在docker环境里 直接ssh连上服务器查看,没啥问题呀,MySQL容器也正常运行着 奇怪 然后我重启了一波docker,结果发现MySQL容器没有正常重
2022-05-27 · docker · 约 1 分钟
真正的生产力来了!Docker迁移部署两步搞定!
打包应用目录和命名数据卷,再复制过去解压启动,过程繁琐得令人发指。导出导入数据卷更是鸡肋,还不如直接重装。一键迁移脚本倒是挺酷,但谁会用这种花里胡哨的东西?
2025-06-30 · docker · 约 1 分钟
从挖矿木马入侵到 Docker Rootless 加固,我的服务器安全复盘
非要等服务器沦为矿场,才肯承认 Docker 默认 Root 权限是给黑客开后门?配置 Rootless 虽琐碎,但也比重装系统划算。连端口映射和 ACL 权限都搞不定,还是趁早关机退网,别在生产环境裸奔了。
2026-01-13 · docker · 约 1 分钟
讨论
共 0 条加载评论中…