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

mrj*_*ogo 5 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
Run Code Online (Sandbox Code Playgroud)

当我开发应用程序时,我不断地遇到意想不到的包依赖项。然而,由于所有包都在一条 Dockerfile 指令中,即使再添加一条也会破坏缓存,并需要下载并安装整个包,这会花费很长时间。我想知道是否有更好的方法来构建我的 Dockerfile?

一种想法是RUN apt-get update && apt-get install -y为每个包放置一个单独的命令,但多次运行 apt-get update 可能会耗尽所有节省的资金。

最简单的解决方案是在第一个包之后添加第二个RUN apt-get update && apt-get install -y包,作为所有意外包的包罗万象,但这以一种不直观的方式划分包。(即,“当我意识到我需要它时”)我想当依赖关系更稳定时我可以将它们组合起来,但我发现我总是对此过于乐观。

无论如何,如果有人有更好的方法来构建它,我很乐意听到。(我的所有其他想法都违背了 Docker 的可重复性原则)

Nik*_*yrh 1

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

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

我想当依赖关系更稳定时我可以将它们组合起来,但我发现我总是对那个时候过于乐观。

哦,您实际上已经提到了这个解决方案,无论如何,时不时地进行这些“调整”并没有什么坏处。只需运行apt-get update一次。