gpt4 book ai didi

docker - Dockerfile 中的多个 RUN 条目和只有一个 RUN 条目有什么区别?

转载 作者:行者123 更新时间:2023-12-02 08:05:15 30 4
gpt4 key购买 nike

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

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

只有一个 RUN 条目?

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

OBS。我不是问哪个更好。我想知道这两种方法之间的所有差异。

最佳答案

每个 RUN 命令都会创建一层文件系统更改,该文件系统更改由开始运行该命令的临时容器生成。 (它有效地运行 docker run,然后将 docker diff 的结果打包到文件系统层。)

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

  • 它们是不可变的。一旦你创建它们,你就不会改变它们。您将不得不生成/重新创建一个新层,以更新您的图像。
  • 它们可在多个图像和正在运行的容器之间重复使用。由于不变性,您可以这样做。
  • 您不从父层删除文件,但您可以在后面的层中注册一个文件被删除。这是后一层中的元数据更改,而不是对父层的修改。
  • 图层在 docker 的构建缓存中重复使用。如果两个不同的图像,甚至是正在重建的相同图像,在同一父层之上执行相同的命令,docker 将重用已经创建的层。
  • 这些层被合并到您在容器中看到的最终文件系统中。

这两种方法的主要区别在于构建缓存和删除文件。如果您将源代码 tgz 的下载、tgz 的提取、二进制文件的编译以及 tgz 和源文件夹的删除拆分为多个 RUN 行,那么当您将图像发送过来时网络并将其存储在磁盘上,即使您没有在最终容器中看到它,您也将拥有层中的所有源。您的图片会明显变大。

当缓存过多时,缓存也可能是一件坏事。如果你拆分 apt updateapt install,然后在几个月后添加一个新包安装到你的第二个运行行,docker 将重用 的几个月旧缓存>apt update 并尝试安装几个月前的软件包,可能不再可用,并且您的镜像可能无法构建。许多人还在安装 debian 软件包后运行 rm -rf/var/lib/apt/lists/*。如果您在单独的步骤中执行此操作,您实际上并不会删除之前图层中的文件,因此您的图像不会缩小。

关于docker - Dockerfile 中的多个 RUN 条目和只有一个 RUN 条目有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52368219/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com