0

鉴于以下 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-tools 中的 egpip-compile --update可能有所帮助,但对 docker 如何缓存文本文件了解得太少。

4

1 回答 1

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 映像中(也许您应该在没有层缓存的情况下进行每日构建)。

于 2021-11-26T09:42:33.277 回答