如何在AWS Lambda的Python Docker容器中安装新版SQLite3?
在AWS Lambda的Python 3.9镜像中升级SQLite的解决方案
首先纠正你一个误解:pysqlite3-binary其实是有aarch64架构的wheel包的,你之前找不到是因为Lambda镜像自带的pip版本太旧,无法识别新的多架构包索引。先试试这个最简单的方案:
方案1:升级pip后安装pysqlite3-binary
Lambda的Python 3.9镜像自带的pip版本可能停留在几年前,对新架构的支持不完善。你只需要在Dockerfile里先升级pip,再安装包即可:
FROM public.ecr.aws/lambda/python:3.9 # 先把pip升级到最新版本 RUN pip install --upgrade pip # 安装pysqlite3-binary RUN pip install pysqlite3-binary # 复制你的Python脚本到Lambda指定目录 COPY your_script.py ${LAMBDA_TASK_ROOT} # 设置Lambda入口 CMD ["your_script.lambda_handler"]
然后在你的Python脚本开头,替换默认的sqlite3模块,这样代码里所有调用sqlite3的地方都会使用新版SQLite:
import pysqlite3 import sys sys.modules['sqlite3'] = pysqlite3 # 接下来正常使用sqlite3即可 import sqlite3 print(sqlite3.sqlite_version) # 这里会显示新版的版本号
这个方案最简洁,不需要复杂的多阶段构建,只要升级pip就能解决找不到包的问题。
方案2:多阶段编译新版SQLite(如果方案1失效)
如果因为某些原因pysqlite3-binary仍然无法安装,或者你需要特定版本的SQLite,可以用多阶段构建自己编译SQLite和pysqlite3,完全适配Lambda的aarch64环境:
# 第一阶段:编译新版SQLite和pysqlite3 FROM public.ecr.aws/lambda/python:3.9 AS builder WORKDIR /tmp # 安装编译依赖 RUN yum install -y gcc make wget # 下载并编译你需要的SQLite版本(这里用3.44.0为例,可替换) RUN wget https://www.sqlite.org/2024/sqlite-autoconf-3440000.tar.gz RUN tar xzf sqlite-autoconf-3440000.tar.gz WORKDIR /tmp/sqlite-autoconf-3440000 RUN ./configure --prefix=/opt/sqlite RUN make && make install # 编译pysqlite3,链接到刚编译的新版SQLite WORKDIR /tmp RUN pip install --upgrade pip setuptools wheel RUN pip install pysqlite3 --no-binary :all: \ --install-option="--sqlite-lib=/opt/sqlite/lib" \ --install-option="--sqlite-include=/opt/sqlite/include" # 第二阶段:构建最终的Lambda镜像 FROM public.ecr.aws/lambda/python:3.9 # 复制编译好的SQLite库到系统目录 COPY --from=builder /opt/sqlite/lib/libsqlite3.so* /usr/lib64/ # 复制编译好的pysqlite3到Python的site-packages COPY --from=builder /var/lang/lib/python3.9/site-packages/pysqlite3 /var/lang/lib/python3.9/site-packages/pysqlite3 # 复制你的脚本并设置入口 COPY your_script.py ${LAMBDA_TASK_ROOT} CMD ["your_script.lambda_handler"]
同样,在脚本开头替换默认的sqlite3模块即可使用新版功能。
为什么RPM包安装失败?
你尝试安装CentOS 8的SQLite RPM包失败,是因为Lambda的基础镜像是Amazon Linux 2,它的依赖库(比如GLIBC版本)比CentOS 8旧很多,两者的包生态不兼容,所以这条路走不通,不建议继续尝试。
内容的提问来源于stack exchange,提问作者Nick K9
相关产品推荐
相关产品推荐

