".build-deps"是用于apk add --virtual命令的什么东西?

214

以下命令中的.build-deps是什么?我在Alpine文档中找不到解释。这是预定义的文件吗?我看到很多Dockerfile中都有引用到它。

RUN apk add --no-cache --virtual .build-deps \
gcc \
freetype-dev \
musl-dev

RUN pip install --no-cache-dir <packages_that_require_gcc...> \

RUN apk del .build-deps

55
请注意,将' del '命令放在单独的RUN命令中并不会减小镜像大小,因为删除操作是在文件系统的新层中运行的。 - scipilot
为什么Docker镜像是UFS,新层中的apk del也可以减小镜像大小。 - focus zheng
2个回答

359
如果您查看文档
-t, --virtual NAME    Instead of adding all the packages to 'world', create a new 
                      virtual package with the listed dependencies and add that 
                      to 'world'; the actions of the command are easily reverted 
                      by deleting the virtual package

这意味着当您安装软件包时,这些软件包不会添加到全局软件包中。而且这种变化可以很容易地被还原。所以如果我需要gcc来编译程序,但一旦程序编译完成,我就不再需要gcc了。
我可以在一个虚拟包中安装gcc和其他必需的软件包及其所有依赖项,并且可以通过删除该虚拟包名称来删除所有内容。以下是一个使用示例。
RUN apk add --virtual mypacks gcc vim \
 && apk del mypacks

下一个命令将删除使用第一个命令安装的所有18个软件包。在Docker中,这些必须作为单个RUN命令执行(如上所示),否则它不会减小镜像大小。

2
值得一提的是,在创建虚拟包时,使用一个当前配置的存储库中不存在的唯一名称非常重要,否则安装软件包会成功,但不会安装您所需的内容。 - bazeusz
15
注意:您必须在一个RUN命令中执行它,否则它无法从先前的Docker镜像层中删除。参考链接:https://dev59.com/HVcP5IYBdhLWcg3wyc7W#49714913 - Zulhilmi Zainudin

23

.build-deps是Alpine中称为“虚拟包”的任意名称,您可以在其中添加软件包。

它创建了一个额外的软件包集合,“有限的时间”内您需要这些软件包(例如编译器用于构建其他东西)。

其主要目的是尽可能使您的镜像保持精简和轻量化,因为一旦使用这些软件包后,您可以轻松地将其删除。

请记住,如果您想实现轻量级的主要目的,则应将其包含在相同的 RUN 中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接