Ventajas de Alpine Dockerfile de --no-cache vs. rm / var / cache / apk / *

87

Al crear Dockerfiles usando la imagen de Alpine, a menudo he visto el uso de apk --no-cachey otras veces está comprometido y en su lugar veo rm /var/cache/apk/*.

Tengo curiosidad por saber si se hace uso del --no-cachearchivo se elimina la necesidad de hacer un rm /var/cache/apk/*. También me gustaría saber si se favorece un estilo sobre otro.

Ángel S. Moreno
fuente
3
Tengo entendido que --no-cacheestá ahí para que no tengas que hacerlo rm /var/cache/apk/*más tarde
Javier Buzzi

Respuestas:

121

La --no-cacheopción permite no almacenar en caché el índice localmente, lo que es útil para mantener los contenedores pequeños.

Literalmente es igual apk updateal principio y rm -rf /var/cache/apk/*al final.

Algún ejemplo donde usamos la --no-cacheopción:

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

Otro ejemplo donde no usamos la --no-cacheopción:

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

Como puede ver, ambos casos son válidos. En cuanto a mí, usar la --no-cacheopción es más elegante.

Nickgryg
fuente
5
Estoy de acuerdo en que --no-cachees más elegante. Pero con varios apk add --no-cachecomandos, los archivos de índice se descargan cada vez. En este caso, hay menos charlas en la red apk updateen la parte superior y luego rm -rf /var/cache/apk/*en la parte inferior. Esto realmente importa cuando se agregan algunos paquetes --virtualy otros no.
lilole
2

Creo que este es un estilo de diseño. La esencia de la caché es reutilizar, por ejemplo, varios contenedores pueden montar el mismo sistema de archivos en caché sin descargarlo repetidamente de la red.

Puede ver la wiki de apline: https://wiki.alpinelinux.org/wiki/Alpine_Linux_package_management#Local_Cache

lupguo
fuente
1
Los manifiestos de apk son tan eficientes que yo diría que el esfuerzo de compartir un caché no vale la pena, especialmente porque tendrías que actualizar el caché cada vez para obtener las versiones más recientes de todos modos. También puede no almacenar en caché en Docker
Daniel Farrell
si está usando Docker, es mejor usar la opción sin caché en cada apk add y no al final, mejor si tiene una sola para instalar todo lo que necesita para evitar crear capas de Docker
ventana