构建图像时,Docker构建缓存如何检测层中的更改?

sr4lhrrt  于 2022-12-26  发布在  Docker
关注(0)|答案(1)|浏览(150)

当我在我的项目中从Dockerfile构建图像时,Docker如何知道我导入的包是否有任何更改。例如,假设我的Dockerfile中有RUN pip install flask,我从它构建图像。假设我在几天后再次从该Dockerfile重建图像,但Flask包已更新。Docker是否仍使用缓存层?或者运行命令fresh来获取最新的Flask包。如果它不使用缓存,它怎么知道Flask包被更新了呢?
我知道有清除该高速缓存和构建映像的选项,但是我怎么知道我安装的软件包有更新呢?这似乎不是一个合理的解决方案,因为如果我们使用数百个软件包,我们将不得不检查每个软件包,看看它们是否有更新。
我试着在谷歌上搜索这个问题,但我不断得到的结果对码头差异命令,这不是我需要的。

0yycz8jy

0yycz8jy1#

Docker不知道包是否已远程更改。唯一影响构建缓存的是构建上下文中文件的修改时间。例如,如果您的Docker文件包括:

COPY requirements.txt /app/requirements.txt

如果你修改了requirements.txt,这将使该命令和任何后续命令该高速缓存失效。

RUN pip install flask

无论flask包是否更新,它都将无限期地保留在缓存中。Docker对Python包(或apt包,或rpm包,等等)一无所知。
...我怎么知道我安装的软件包有更新?这似乎不是一个合理的解决方案,因为如果我们使用数百个软件包,我们将不得不检查每个软件包,看看它们是否已经更新。
你不需要逐个检查所有的包,如果你偶尔构建镜像时禁用缓存,你会得到所有包的最新版本。
另一方面,如果你有一个配置好并正常运行的应用程序,你可能不想更新数百个软件包(如果它坏了怎么办?),这就是为什么在生产中,很多人会把他们的依赖关系固定到一个特定的版本(pip install flask==2.2.2):这可以防止意外的更新破坏东西,并且意味着你可以控制更新发生的时间。
特别是对于Python,像Pipenv这样的工具可以帮助管理大量依赖项的版本锁定。

相关问题