Alpine Dockerfile的优点--no-cache Vs. rm/var/cache/apk/*

Ang*_*eno 39 docker dockerfile alpine-linux

当使用Alpine图像创建Dockerfiles时,我经常看到它的使用apk --no-cache以及其他时间它被提交,而我看到了rm /var/cache/apk/*.

我很想知道利用--no-cache消除以后需要做的事情rm /var/cache/apk/*.我还想知道一种风格是否比另一种更受青睐.

Nic*_*lay 55

--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 ..
Run Code Online (Sandbox Code Playgroud)

我们不使用--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'
Run Code Online (Sandbox Code Playgroud)

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

  • @lilole [建议](/sf/ask/3438300561/#comment111342789_49119046) 的主要问题是`rm -rf ...` 当作为单独的 Dockerfile `RUN` 语句执行时,不会减小图像大小。您必须在同一个运行语句中执行它,否则缓存将被隐藏在图像层中,尽管无法在最终图像中访问。 (19认同)
  • 我同意 `--no-cache` 更优雅。但使用多个 apk add --no-cache 命令时,每次都会下载索引文件。在这种情况下,在顶部执行“apk update”,然后在底部附近执行“rm -rf /var/cache/apk/*”,网络干扰会更少。当某些软件包添加了“--virtual”而某些软件包没有添加时,这一点确实很重要。 (11认同)
  • @lilole 你不能将多个“apk add”命令合并到一个命令中吗? (2认同)
  • 如果我在 debian 镜像上使用 `apt-get` ,那么 `--no-cache` 相当于什么? (2认同)

Rod*_*rry 7

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

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