126 votes

Dockerfile Alpine Avantages de --no-cache Vs. rm /var/cache/apk/*

Lors de la création de Dockerfiles à l'aide de l'image Alpine, j'ai souvent vu l'utilisation de l'option apk --no-cache et d'autres fois il est engagé et à la place je vois rm /var/cache/apk/* .

Je suis curieux de savoir comment utiliser le --no-cache élimine la nécessité d'effectuer ultérieurement un rm /var/cache/apk/* . J'aimerais également savoir si un style est préféré à un autre.

9 votes

Si je comprends bien, le --no-cache est là pour que vous Ne le fais pas. doivent faire rm /var/cache/apk/* plus tard

0 votes

À titre de mise à jour, en utilisant Buildkit vous pouvez maintenant laisser libre cours à vos caches APK, etc. sans avoir besoin de répéter les téléchargements ou d'augmenter la taille de vos images en montant ces caches sur votre hôte avec RUN --mount=type=cache... . apt exemple aquí

187voto

Nickolay Points 9297

El --no-cache L'option permet de ne pas mettre en cache l'index localement, ce qui est utile pour garder des conteneurs de petite taille.

Littéralement, cela équivaut à apk update au début et rm -rf /var/cache/apk/* à la fin.

Quelques exemples où nous utilisons --no-cache option :

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

Un autre exemple où nous n'utilisons pas --no-cache option :

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

Comme vous pouvez le constater, les deux cas sont valables. Pour ma part, j'utilise --no-cache est plus élégante.

14 votes

Je suis d'accord que --no-cache est plus élégant. Mais avec de multiples apk add --no-cache les fichiers d'index sont téléchargés à chaque fois. Dans ce cas, il y a moins d'échanges sur le réseau à faire. apk update en haut, puis rm -rf /var/cache/apk/* près du bas. Ceci est vraiment important lorsque certains paquets sont ajoutés avec --virtual et certains ne le sont pas.

2 votes

@lilole Ne pourriez-vous pas simplement consolider les multiples apk add en une seule commande ?

1 votes

@PaulCalabro Nos Dockerfiles à mon travail utilisent toujours un seul apk add . Mais le --virtual est plutôt intéressante, et elle est vraiment efficace avec de multiples apk add appels. Cependant, à long terme, nous passerions probablement à des Dockerfiles à plusieurs étages avant que --virtual serait vraiment bénéfique pour nous.

6voto

Rod Terry Points 161

Je pense que c'est un style de conception. L'essence du cache est la réutilisation, par exemple, plusieurs conteneurs peuvent monter le même système de fichiers en cache sans le télécharger de manière répétée depuis le réseau.

Peut consulter le wiki d'apline : https://wiki.alpinelinux.org/wiki/Alpine_Linux_package_management#Local_Cache

1 votes

Les manifestes apk sont si efficaces que je dirais que l'effort pour partager un cache n'en vaut pas la peine, surtout parce que vous devrez mettre à jour le cache à chaque fois pour obtenir les versions les plus récentes de toute façon. Autant ne pas mettre de cache du tout dans Docker.

0 votes

Si vous utilisez docker, il vaut mieux utiliser l'option no-cache dans chaque ajout d'apk et non à la fin, mieux si vous avez un seul pour installer tout ce dont vous avez besoin pour éviter de créer des couches docker.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X