Alpine Dockerfile --no-cache Vs 的优势。 rm /var/cache/apk/*

Posted

技术标签:

【中文标题】Alpine Dockerfile --no-cache Vs 的优势。 rm /var/cache/apk/*【英文标题】:Alpine Dockerfile Advantages of --no-cache Vs. rm /var/cache/apk/* 【发布时间】:2018-08-13 14:06:01 【问题描述】:

在使用 Alpine 映像创建 Dockerfile 时,我经常看到使用 apk --no-cache,其他时候它被提交,而我看到的是 rm /var/cache/apk/*

我很想知道使用--no-cache 消除了以后使用rm /var/cache/apk/* 的需要。我也想知道一种风格是否比另一种更受欢迎。

【问题讨论】:

我的理解是,--no-cache 就在那里,所以你以后不必必须做rm /var/cache/apk/* 作为更新,使用Buildkit,您现在可以通过使用RUN --mount=type=cache... 将这些缓存安装到您的主机,让您的APK 等缓存疯狂运行,而无需重复下载或增加您的图像大小。 apt 示例 here 【参考方案1】:

--no-cache 选项允许不在本地缓存索引,这对于保持容器较小很有用。

从字面上看,它等于开头的 apk update 和结尾的 rm -rf /var/cache/apk/*

我们使用--no-cache 选项的一些示例:

$ docker run -ti alpine:3.7
/ # apk add nginx
WARNING: Ignoring APKINDEX.70c88391.tar.gz: No such file or directory
WARNING: Ignoring APKINDEX.5022a8a2.tar.gz: No such file or directory
ERROR: unsatisfiable constraints:
  nginx (missing):
    required by: world[nginx]
/ # 
/ # apk add --no-cache nginx
fetch http://dl-cdn.alpinelinux.org/alpine/v3.7/main/x86_64/APKINDEX.tar.gz
fetch http://dl-cdn.alpinelinux.org/alpine/v3.7/community/x86_64/APKINDEX.tar.gz
(1/2) Installing pcre (8.41-r1)
(2/2) Installing nginx (1.12.2-r3)
Executing nginx-1.12.2-r3.pre-install
Executing busybox-1.27.2-r7.trigger
OK: 6 MiB in 13 packages
/ # 
/ # ls -la /var/cache/apk/
total 8
drwxr-xr-x    2 root     root          4096 Jan  9 19:37 .
drwxr-xr-x    5 root     root          4096 Mar  5 20:29 ..

另一个不使用--no-cache 选项的例子:

$ docker run -ti alpine:3.7
/ # apk add nginx
WARNING: Ignoring APKINDEX.70c88391.tar.gz: No such file or directory
WARNING: Ignoring APKINDEX.5022a8a2.tar.gz: No such file or directory
ERROR: unsatisfiable constraints:
  nginx (missing):
    required by: world[nginx]
/ # 
/ # apk update
fetch http://dl-cdn.alpinelinux.org/alpine/v3.7/main/x86_64/APKINDEX.tar.gz
fetch http://dl-cdn.alpinelinux.org/alpine/v3.7/community/x86_64/APKINDEX.tar.gz
v3.7.0-107-g15dd6b8ab3 [http://dl-cdn.alpinelinux.org/alpine/v3.7/main]
v3.7.0-105-g4b8b158c40 [http://dl-cdn.alpinelinux.org/alpine/v3.7/community]
OK: 9048 distinct packages available
/ # 
/ # apk add nginx
(1/2) Installing pcre (8.41-r1)
(2/2) Installing nginx (1.12.2-r3)
Executing nginx-1.12.2-r3.pre-install
Executing busybox-1.27.2-r7.trigger
OK: 6 MiB in 13 packages
/ # 
/ # ls -la /var/cache/apk/
total 1204
drwxr-xr-x    2 root     root          4096 Mar  5 20:31 .
drwxr-xr-x    6 root     root          4096 Mar  5 20:31 ..
-rw-r--r--    1 root     root        451508 Mar  3 00:30 APKINDEX.5022a8a2.tar.gz
-rw-r--r--    1 root     root        768680 Mar  5 09:39 APKINDEX.70c88391.tar.gz
/ # 
/ # rm -vrf /var/cache/apk/*
removed '/var/cache/apk/APKINDEX.5022a8a2.tar.gz'
removed '/var/cache/apk/APKINDEX.70c88391.tar.gz'

如您所见,这两种情况都有效。至于我,使用--no-cache 选项更优雅。

【讨论】:

我同意--no-cache 更优雅。但是使用多个apk add --no-cache 命令,每次都会下载索引文件。在这种情况下,在顶部执行apk update,然后在底部附近执行rm -rf /var/cache/apk/* 会减少网络聊天。当某些软件包添加了 --virtual 而有些没有添加时,这真的很重要。 @lilole 你不能把多个apk add 命令合并成一个命令吗? @PaulCalabro 我们的 Dockerfile 在我的工作中总是使用一个 apk add。但是--virtual 选项有点简洁,它确实在多次apk add 调用中大放异彩。但是从长远来看,我们可能会在 --virtual 真正使我们受益之前转向多阶段 Dockerfile。 如果我在 debian 映像上使用 apt-get--no-cache 的等价物是什么?【参考方案2】:

我认为这是一种设计风格。缓存的本质是复用,比如多个容器可以挂载同一个缓存文件系统,而不需要从网络上重复下载。

可以查看apline wiki:https://wiki.alpinelinux.org/wiki/Alpine_Linux_package_management#Local_Cache

【讨论】:

apk 清单是如此高效,我认为共享缓存的努力是不值得的,尤其是因为您每次都必须更新缓存才能获得最新版本。也可以在 docker 中根本不缓存 如果您使用 docker,最好在每个 apk 添加中使用 no-cache 选项,而不是在最后,如果您有一个安装所有您需要避免创建 docker 层的文件,则更好

以上是关于Alpine Dockerfile --no-cache Vs 的优势。 rm /var/cache/apk/*的主要内容,如果未能解决你的问题,请参考以下文章

基于alpine用dockerfile创建的tomcat镜像

基于alpine用dockerfile创建的ssh镜像

我们如何使用 dpkg 在 dockerfile 中的 alpine 图像上安装 google-chrome-stable?

dockerfile 的问题 FROM alpine:3.8 temporary error (try again later)

linux12企业实战 -- 06alpine Linux简介alpine制作jdk镜像jre镜像 Alpine 命令

Alpine Dockerfile --no-cache Vs 的优势。 rm /var/cache/apk/*