它继续使用缓存,而新版本可用

It keeps using the cache whereas a new version in available

Dockerfile 包含:

RUN /bin/bash -c "python3 -m pip install --upgrade pip && python3 -m pip install conan"

一旦构建,它就再也不会 运行 而是使用缓存。只要版本(pip's + conan's)没变我就没问题。

处理这种情况的最佳做法是什么?我想docker/buildah检测如果有新版本是否需要换层。我特意没有添加任何版本以始终获取最新版本。

我很难找到我遇到的错误的原因,Conan 已经在新版本中更改了他们的 SSL 证书,而我被困在阻止我安装软件包的旧版本中。

这个冲突正是使用 版本锁定文件 的原因,它列出了要使用的包的特定版本。即使您认为您通常需要最新版本,这也为您(或打包工具)提供了一个地方来记录一组您知道有效的特定版本。

使用Python的基础setuptools system, for example, you can declare in your setup.cfg file that your application needs that specific package

[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

在您的 Docker 文件中,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 在 Docker 中单独打包文件)。