【问题标题】:Does docker layer caching combined with pip install lead to nonreproducible images?docker 层缓存与 pip install 相结合会导致无法重现的图像吗?
【发布时间】:2022-01-04 08:55:16
【问题描述】:

给定the following dockerfile

FROM python:3.9
WORKDIR /code
COPY ./requirements.txt /code/requirements.txt
RUN pip install --no-cache-dir --upgrade -r /code/requirements.txt
COPY ./app /code/app
CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "80"]

当我们在同一台机器上多次运行它时,我的理解是对于RUN pip install,将使用缓存的 docker 层,除非我们更改requirements.txt。但是,如果是一台没有层缓存的新机器和一些新发布的包,相同的 Dockerfile 会导致安装不同的包,对吗?

如果是,确保最佳做法是什么

  • 可重现的构建
  • 使用 docker 层缓存快速构建
  • 使用最新的可用软件包?

我可以设想使用例如pip-compile --update 来自 pip-tools 可能会有所帮助,但对 docker 如何缓存文本文件了解太少。

【问题讨论】:

  • 我在pip freeze 周围写了一个食谱来回应It keeps using the cache whereas a new version in available;这对你有帮助吗?我建议使用setup.cfg 列出广泛的版本约束(“最新可用”),然后使用pip freeze 生成具有确切已知工作版本(“可重复构建”)的requirements.txt 文件。

标签: python docker pip dockerfile pip-tools


【解决方案1】:

在 Docker 中,一旦层发生变化,所有下游层也必须重新创建。

这可能有更好的来源,但这里有一个来源:https://docs.microsoft.com/en-us/visualstudio/docker/tutorials/image-building-best-practices

我不知道您的 requirements.txt 中有什么,但您生成的 Docker 映像可能不同的一个原因是,当您更改您的 requirements.txt x 天/月时,以及requirements.txt 已更新(外部)。

为防止这种情况,请使用固定要求。 您可以通过 package==1.2.3.4 等明确设置您的要求。

如果您还想固定子需求,请查看诸如诗歌之类的工具来创建锁定文件,以获得与在开发环境中构建它时相同的环境。 https://python-poetry.org/

如果你总是想生成最新的可用包,我不明白你为什么要将它烘焙到 docker 映像中(也许你应该在没有层缓存的情况下进行每日构建)。

【讨论】:

  • 我会在夜间构建它,但是当你有时间的时候刷新和重新创建缓存是正确的方法。
猜你喜欢
  • 2019-03-22
  • 1970-01-01
  • 1970-01-01
  • 2018-12-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-03
相关资源
最近更新 更多