之前我们重新设计了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
很明显,这是一个系统环境的问题。当我将镜像从slim镜像更改为普通的python镜像后,问题得到了解决。
既然找到了问题的原因,我们可以着手解决了。
使用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镜像基于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镜像则有很多不同之处,需要更多的折腾。
未经允许不得转载:大白鲨游戏网 » 解决DjangoStarter Docker部署中的PostgreSQL数据库问题