Alpine Dockerfile Vorteile von --no-cache Vs. rm / var / cache / apk / *

79

Beim Erstellen von Dockerfiles mit dem Alpine-Image habe ich oft die Verwendung des apk --no-cacheund anderer Commits gesehen , und stattdessen sehe ich rm /var/cache/apk/*.

Ich bin neugierig zu wissen, dass die Verwendung von das --no-cachedie Notwendigkeit beseitigt, später eine zu tun rm /var/cache/apk/*. Ich würde auch gerne wissen, ob ein Stil einem anderen vorgezogen wird.

Engel S. Moreno
quelle
3
Mein Verständnis ist , dass, das --no-cacheist es , so dass Sie nicht tun müssen , um rm /var/cache/apk/*später
Javier Buzzi

Antworten:

109

Mit dieser --no-cacheOption kann der Index nicht lokal zwischengespeichert werden. Dies ist hilfreich, um Container klein zu halten.

Es ist buchstäblich gleich apk updateam Anfang und rm -rf /var/cache/apk/*am Ende.

Ein Beispiel, in dem wir die --no-cacheOption verwenden:

$ 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 ..

Ein weiteres Beispiel, bei dem wir keine --no-cacheOption verwenden:

$ 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'

Wie Sie sehen, sind beide Fälle gültig. Für mich ist die Verwendung von --no-cacheOptionen eleganter.

Nickgryg
quelle
4
Ich stimme zu, dass --no-cachedas eleganter ist. Bei mehreren apk add --no-cacheBefehlen werden die Indexdateien jedoch jedes Mal heruntergeladen. In diesem Fall ist es weniger Netzwerk-Chatter apk updateoben rm -rf /var/cache/apk/*als unten. Dies ist wirklich wichtig, wenn einige Pakete hinzugefügt werden --virtualund andere nicht.
Lilole
2

Ich denke, das ist ein Designstil. Der Kern des Caches besteht in der Wiederverwendung. Beispielsweise können mehrere Container dasselbe zwischengespeicherte Dateisystem bereitstellen, ohne es wiederholt aus dem Netzwerk herunterzuladen.

Kann das Apline-Wiki anzeigen: https://wiki.alpinelinux.org/wiki/Alpine_Linux_package_management#Local_Cache

Lupguo
quelle
apk-Manifeste sind so effizient, dass sich die Mühe, einen Cache freizugeben, nicht lohnt, insbesondere weil Sie den Cache jedes Mal aktualisieren müssten, um die neuesten Versionen zu erhalten. Kann auch einfach gar nicht im Docker zwischenspeichern
Daniel Farrell