dockerdockerfilealpine-linuxalpine-package-keeper

Alpine Dockerfile advantages of --no-cache vs. rm /var/cache/apk/*


When creating Dockerfiles using an Alpine image, I have often seen the use of either

I am curious to know whether making use of the --no-cache flag eliminates the need to manually clear the package cache using rm /var/cache/apk/*. I would also like to know which style is considered best practice.


Solution

  • The --no-cache option allows to not cache the index locally, which is useful for keeping containers small.

    Literally it equals apk update in the beginning and rm -rf /var/cache/apk/* in the end.

    Some example where we use --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 ..
    

    Another example where we don't use --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'
    

    As you can see both cases are valid. As for me, using --no-cache option is more elegant.