为什么 && 而不是新的 RUN

Pie*_*NAY 6 shell docker dockerfile

Dockerfiles 中,我看到大多数人使用这种语法

RUN apt-get -y update \
    && apt-get install -y libicu-dev
Run Code Online (Sandbox Code Playgroud)

超过这个

RUN apt-get -y update
RUN apt-get install -y libicu-dev
Run Code Online (Sandbox Code Playgroud)

对我来说,第一个仅缓存一行(层),而第二个则缓存两者(我错了吗?),并在命令不成功时立即停止。

此外,我不认为第一个更具可读性。

那么为什么我们要使用第一种语法呢?

Pie*_*NAY 1

根据图像和图层文档

每层只是与之前层的一组差异

例如,创建不同文件的 2 层不会使用更多磁盘空间。特别是因为 Docker 17.05允许多阶段构建。但是,如果第二个完全修改第一个的文件,它仍然可能使用更多空间。

根据Khapov Igor 的评论,我在最佳实践文档中找到了原始问题的真正答案:

apt-get update在语句中单独使用RUN会导致缓存问题并且后续apt-get install指令失败。

它实际上更多的是与先前命令的层依赖关系,其结果可以随着时间的推移而演变,就像apt-get update.

这就是为什么他们说:

始终在同一个语句中结合RUN apt-get update使用apt-get installRUN