Poetry项目上传CodeArtifact后Docker安装依赖一致性问题
问题解答
1. pip安装是否遵循poetry.lock?
不会。poetry.lock是Poetry专属的依赖锁定文件,pip完全不识别它。当你用pip install安装上传到CodeArtifact的项目时,pip会严格按照pyproject.toml里的依赖范围(比如^2.1.4对应>=2.1.4且<3.0.0)去拉取该范围内的最新版本,比如pandas 2.2.0只要符合范围就会被安装,完全不会考虑poetry.lock里的锁定版本。
2. 如何避免安装新版本?
有几种可行方案,按需选择:
方案一:硬改pyproject.toml的依赖版本
把^2.1.4这种范围约束改成固定版本,比如:
[tool.poetry.dependencies] pandas = "2.1.4" pytest-mock = "3.12.0"
改完重新执行poetry build并上传到CodeArtifact,之后用pip安装时就会严格安装指定的固定版本。缺点是后续要更新依赖得手动修改版本号。
方案二:用Poetry+lock文件在容器内安装
如果愿意在Docker容器里用Poetry替代pip,可以这么操作:
- 在Docker镜像中先安装Poetry
- 把本地的
pyproject.toml和poetry.lock复制到容器内 - 配置Poetry指向你的CodeArtifact仓库源
- 执行
poetry install,Poetry会完全按照poetry.lock的锁定版本安装所有依赖,包括你的项目本身。
方案三:导出requirements.txt固定依赖
用Poetry导出包含锁定版本的requirements.txt:
poetry export -f requirements.txt --output requirements.txt --without-hashes
然后在Docker容器里:
- 先执行
pip install -r requirements.txt,把所有依赖固定到lock里的版本 - 再执行
pip install你的项目库
这样pip安装你的库时,因为依赖已经是固定版本,就不会再拉取新版本了。
内容的提问来源于stack exchange,提问作者Khan
相关产品推荐
相关产品推荐

