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