使用python-slim映象遇到無法使用PostgreSQL的問題

程序设计实验室發表於2024-08-20

前言

之前不是把 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 映象不一樣的地方就很多了,太折騰了…

相關文章