使用GitHub Actions构建Python Lambda Docker镜像时Pipenv部署失败
问题核心
GitHub Actions构建Python Lambda的Docker容器时,pipenv install --deploy报错:在--require-hashes模式下,pysqlite3-binary未用==固定版本,导致依赖安装失败。一年前构建正常,替换为typer后可正常构建,说明问题出在pysqlite3-binary的版本锁定或依赖哈希上。
解决方案
1. 直接固定pysqlite3-binary的精确版本
打开项目的Pipfile,找到pysqlite3-binary的条目,将版本改为==x.y.z格式(替换为实际需要的版本号,比如0.4.15):
[packages] pysqlite3-binary = "==0.4.15"
执行以下命令重新生成包含正确哈希的Pipfile.lock:
pipenv lock --deploy
提交更新后的Pipfile和Pipfile.lock到仓库,重新触发GitHub Actions构建。
2. 刷新Pipfile.lock的哈希值
如果Pipfile中已经固定版本但仍报错,可能是lock文件中的哈希过期。执行以下命令清除旧锁并重新生成:
pipenv lock --clear pipenv lock --deploy
提交新的Pipfile.lock后重新构建。
3. 排查间接依赖问题
如果pysqlite3-binary是间接依赖(未直接在Pipfile中声明),先通过依赖树找到引入它的包:
pipenv graph
找到对应的上游依赖后,在Pipfile中固定该依赖的版本,确保间接引入的pysqlite3-binary版本被锁定,再重新生成lock文件。
本地验证步骤
- 本地执行
pipenv install --deploy,确认无报错。 - 本地构建Docker镜像验证:
docker build -t lambda-test-image .
- 提交文件后触发GitHub Actions构建。
相关文件示例
错误日志片段
Warning: pysqlite3-binary is not using a version range that starts with ==, which is required for --deploy mode.
Could not find a version that matches pysqlite3-binary>=0.4.0 (from -r /tmp/pipenv-xxxx-requirements.txt (line x)) with hashes specified.
Dockerfile示例
FROM public.ecr.aws/lambda/python:3.9 WORKDIR /var/task COPY Pipfile Pipfile.lock ./ RUN pip install pipenv && pipenv install --deploy --system COPY . . CMD ["lambda_function.lambda_handler"]
内容的提问来源于stack exchange,提问作者Nick K9

