代码之家  ›  专栏  ›  技术社区  ›  Daniel Santos

Dockerfile中的多个运行条目和只有一个运行条目有什么区别?

  •  1
  • Daniel Santos  · 技术社区  · 7 年前

    Dockerfile中的多个运行条目之间有什么区别,例如:

    FROM php:5.6-apache
    RUN docker-php-ext-install mysqli 
    RUN apt update 
    RUN apt install git -y -q
    

    FROM php:5.6-apache
    RUN docker-php-ext-install mysqli && apt update && apt install git -y -q
    

    OBS公司。我不是问哪个更好。我想知道这两种方法的区别。

    1 回复  |  直到 7 年前
        1
  •  7
  •   BMitch    7 年前

    每个 RUN 命令创建一层由临时容器生成的文件系统更改并开始运行该命令(它有效地运行了一个 docker run docker diff 到文件系统层。)

    这些层有几个关键细节需要注意:

    • 它们可以在多个映像和运行的容器之间重用。你可以这样做,因为不变性。
    • 层在docker的构建缓存中重用。如果两个不同的图像,甚至是重建的同一个图像,在同一父层上执行相同的命令,docker将重用已经创建的层。

    行,然后当您通过网络传送图像并将其存储在磁盘上时,您将拥有层中的所有源,即使您在最终容器中看不到它。你的图像会明显变大。

    当缓存过多时,缓存也是一件坏事。如果你分了 apt update apt install apt更新 并尝试安装几个月前的软件包,可能不再可用,您的映像可能无法构建。很多人还经营着 rm -rf /var/lib/apt/lists/* 安装debian包之后。如果你在一个单独的步骤中这样做,你实际上不会从上一层删除文件,所以你的图像不会缩小。