这种冲突正是使用列出要使用的特定版本的包的版本锁定文件的原因。即使您认为您通常需要最新版本,这也为您(或打包工具)提供了一个地方来记录您知道有效的一组特定版本。
例如,使用 Python 的基本setuptools系统,您可以在setup.cfg
文件中声明您的应用程序需要该特定包
[options]
install_requires=
conan
现在在您的本地(非 Docker)开发环境中,您可以安装它
rm -rf venv # clean up the old virtual environment
python3 -m venv venv # create a new virtual environment
. venv/bin/activate # activate it
pip install -e . # install current directory and its dependencies
或者,如果您已经设置了虚拟环境
pip install --upgrade -e .
现在您可以要求pip
转储需求文件
pip freeze > requirements.txt
在你的 Dockerfile 中,COPY
新requirements.txt
文件中,并使用它来安装包。
FROM python:3.9
# Upgrade pip, since it likes to complain about being out of date
RUN pip install --upgrade pip
# Install package dependencies
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
# Install the rest of the application
COPY . .
CMD ["./application.py"]
Docker 的层缓存系统意味着,如果requirements.txt
文件已更改,Docker 将重新运行pip install
,如果没有,它将跳过它(直到下一COPY
行文件更改)。同时,您可以控制要使用的确切版本(您可以放入版本约束setup.cfg
或手动编辑requirements.txt
以避免损坏的版本),因此上游更改的中断并不意味着您不能发布代码。最后,您在开发环境和 Docker 中使用相同的打包系统,因此很容易保持一致(我通常不鼓励pip install
在 Dockerfile 中使用单个包)。