我为一个应用程序创建了一个Dockerfile,它构建了很多大型apt-get包依赖项。它看起来像这样:
FROM ubuntu:15.10
RUN apt-get update && apt-get install -y \
lots-of-big-packages
RUN install_my_code.sh
在开发应用程序时,我不断提出意外的包依赖性。但是,由于所有软件包都在一个Dockerfile指令中,即使再添加一个软件包也会破坏缓存,并且需要下载和安装整个软件包,这需要永远。我想知道是否有更好的方法来构建我的Dockerfile?
一种想法是为每个包添加一个单独的RUN apt-get update && apt-get install -y
命令,但多次运行apt-get update可能会节省任何费用。
最简单的解决方案是在第一个之后添加第二个RUN apt-get update && apt-get install -y
作为所有未预料到的包的捕获,但是以不直观的方式划分包。 (即"当我意识到我需要它时#34;)我想我可以在依赖关系更稳定的时候将它们结合起来,但我发现我总是过于乐观地认为它是什么时候。
无论如何,如果有人有更好的结构方式,我很乐意听到它。 (我的所有其他想法都违背了Docker的可重复性原则)
答案 0 :(得分:1)
我认为你需要在Dockerfile中运行apt-get update
一次,通常在任何其他apt-get
命令之前运行。
您可以首先安装大量已知程序,如果您想出一个新程序,那么只需向Dockerfile添加一个新的RUN apt-get install -y abc
,然后让docker继续执行以前缓存的命令。您可以定期(每周一次,每月一次?)按照您的意愿重新组织它们,或者只需在一个命令中运行所有内容。
我想我可以在依赖关系更稳定时将它们组合起来,但是 我觉得我总是过于乐观。
哦,你实际上已经提到了这个解决方案,无论如何,不时做这些“调整”是没有害处的。只需运行apt-get update
一次。