如何在Docker镜像中更新Python内置sqlite3至3.35及以上版本
我本地执行python -c "import sqlite3; print(sqlite3.sqlite_version)"显示版本为3.41.1,但用python:3.9.3或python:3.16.0(注:Python暂无3.16.0版本,应为python:3.10.x这类版本)作为基础镜像构建Docker容器后,执行sudo docker exec -t <容器ID> python -c "import sqlite3; print(sqlite3.sqlite_version)"得到的版本是3.34.1,需要升级到至少3.35版本。
问题根源
Python内置的sqlite3模块并非独立可升级的包,它的版本由Python编译时依赖的系统SQLite库版本决定。你使用的旧版Python基础镜像基于低版本Debian发行版,系统自带的SQLite为3.34.1,因此内置sqlite3模块版本也对应这个版本;而requirements.txt中的sqlite3条目,pip实际安装的是第三方pysqlite3包,不会替换系统内置的sqlite3模块。
可行解决方案
方案一:更换为更新的官方Python基础镜像(最简便)
改用基于Debian 12(Bookworm)的Python镜像,该发行版自带的SQLite版本为3.40.1,满足你至少3.35的要求。修改Dockerfile的第一行:
FROM python:3.9-bookworm
构建镜像后验证版本,即可得到符合要求的SQLite版本。
方案二:使用pysqlite3替代内置sqlite3
通过安装第三方预编译的pysqlite3-binary包,在代码中替换使用该库:
- 在
requirements.txt中添加:
pysqlite3-binary>=0.5.0
- 将代码中所有
import sqlite3的语句替换为:
from pysqlite3 import dbapi2 as sqlite3
- 重新构建Docker镜像,确保该包被正确安装,此时代码将使用新版SQLite。
方案三:手动编译新版SQLite并重新编译Python(适合必须保留原基础镜像的场景)
如果无法更换基础镜像,可手动编译安装新版SQLite,再重新编译Python绑定该版本:
在Dockerfile中添加以下步骤(放在原apt-get update之前):
# 安装编译依赖 RUN apt-get update && apt-get install -y build-essential wget # 编译安装SQLite 3.41.1 RUN wget https://www.sqlite.org/2023/sqlite-autoconf-3410100.tar.gz && \ tar xzf sqlite-autoconf-3410100.tar.gz && \ cd sqlite-autoconf-3410100 && \ ./configure --prefix=/usr/local && \ make && make install # 更新系统库缓存 RUN ldconfig # 重新编译Python 3.9.3,绑定新版SQLite RUN wget https://www.python.org/ftp/python/3.9.3/Python-3.9.3.tgz && \ tar xzf Python-3.9.3.tgz && \ cd Python-3.9.3 && \ ./configure --prefix=/usr/local --with-sqlite=/usr/local && \ make && make install
注意:此方案会大幅增加镜像构建时间和体积,仅在必要时采用。
内容的提问来源于stack exchange,提问作者Learning from masters

