适用于许多apt-get软件包的高效Dockerfile

时间:2016-01-13 18:04:08

标签: docker dockerfile

我为一个应用程序创建了一个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的可重复性原则)

1 个答案:

答案 0 :(得分:1)

我认为你需要在Dockerfile中运行apt-get update一次,通常在任何其他apt-get命令之前运行。

您可以首先安装大量已知程序,如果您想出一个新程序,那么只需向Dockerfile添加一个新的RUN apt-get install -y abc,然后让docker继续执行以前缓存的命令。您可以定期(每周一次,每月一次?)按照您的意愿重新组织它们,或者只需在一个命令中运行所有内容。

  

我想我可以在依赖关系更稳定时将它们组合起来,但是   我觉得我总是过于乐观。

哦,你实际上已经提到了这个解决方案,无论如何,不​​时做这些“调整”是没有害处的。只需运行apt-get update一次。