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镜像
我们如何使用 dpkg 在 dockerfile 中的 alpine 图像上安装 google-chrome-stable?
dockerfile 的问题 FROM alpine:3.8 temporary error (try again later)