解决DjangoStarter Docker部署中的PostgreSQL数据库问题

之前我们重新设计了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数据库问题