当我在我的项目中从Dockerfile构建图像时,Docker如何知道我导入的包是否有任何更改。例如,假设我的Dockerfile中有RUN pip install flask
,我从它构建图像。假设我在几天后再次从该Dockerfile重建图像,但Flask包已更新。Docker是否仍使用缓存层?或者运行命令fresh来获取最新的Flask包。如果它不使用缓存,它怎么知道Flask包被更新了呢?
我知道有清除该高速缓存和构建映像的选项,但是我怎么知道我安装的软件包有更新呢?这似乎不是一个合理的解决方案,因为如果我们使用数百个软件包,我们将不得不检查每个软件包,看看它们是否有更新。
我试着在谷歌上搜索这个问题,但我不断得到的结果对码头差异命令,这不是我需要的。
1条答案
按热度按时间0yycz8jy1#
Docker不知道包是否已远程更改。唯一影响构建缓存的是构建上下文中文件的修改时间。例如,如果您的Docker文件包括:
如果你修改了
requirements.txt
,这将使该命令和任何后续命令该高速缓存失效。无论
flask
包是否更新,它都将无限期地保留在缓存中。Docker对Python包(或apt
包,或rpm
包,等等)一无所知。...我怎么知道我安装的软件包有更新?这似乎不是一个合理的解决方案,因为如果我们使用数百个软件包,我们将不得不检查每个软件包,看看它们是否已经更新。
你不需要逐个检查所有的包,如果你偶尔构建镜像时禁用缓存,你会得到所有包的最新版本。
另一方面,如果你有一个配置好并正常运行的应用程序,你可能不想更新数百个软件包(如果它坏了怎么办?),这就是为什么在生产中,很多人会把他们的依赖关系固定到一个特定的版本(
pip install flask==2.2.2
):这可以防止意外的更新破坏东西,并且意味着你可以控制更新发生的时间。特别是对于Python,像Pipenv这样的工具可以帮助管理大量依赖项的版本锁定。