强制步骤缓存在 Dockerfile 中

5 docker dockerfile docker-build

假设我在 Dockerfile 中有这样的行:

RUN git fetch origin my_branch
RUN pip install -r requirements.txt
Run Code Online (Sandbox Code Playgroud)

有没有办法强制 docker 对这些行使用缓存?就像是:

FORCE-CACHE-ON
RUN git fetch origin my_branch
RUN pip install -r requirements.txt
CACHE-OFF
Run Code Online (Sandbox Code Playgroud)

Dav*_*aze 0

Docker 的层缓存本质上是说“如果我从镜像 01234567 开始,RUN some command然后我将得到镜像 2468ace0”。如果某些内容发生了变化,并且您现在拥有映像 13579bdf,则除了再次运行该命令之外,没有其他方法可以短路此操作。

有几种方法可以帮助缓解这种情况:

  • 运行实际上并不依赖于 Dockerfile 早期应用程序代码的重量级命令。 RUN apt-get install在你之前COPY .
  • 尽量减少一张图像中的内容量。不要尝试将两个具有冗长构建的单独应用程序放在同一个映像中。
  • 使用多阶段构建,其中每个阶段都可以独立地利用缓存,并且您将相对便宜地获得COPY最终图像。
  • 在主机上预编译序列的某些部分,并将COPY结果放入图像而不是RUN lengthy-install. (在多阶段构建出现之前,这是一项非常有用的技术,并且仍然具有相关性。)