Blog-Quickie: Schnelles Beispiel für die Erstellung eines Alpine Linux Docker-Images
In meiner Artikel-Serie Docker Images From Scratch habe ich gezeigt, wie ein eigenes Docker Basis-Image erzeugt werden kann. Dazu habe ich Debian als Distribution verwendet.
Das Ergebnis war ein recht kleines Image für Docker (https://hub.docker.com/r/bundeskanzler4711/jessie-minbase/).
Aber das muss noch kleiner und besser gehen.
Schritt 1
Zuerst habe ich mir dafür BusyBox angesehen. BusyBox ist ein wirklich kleines Linux, aber leider ohne Paketmanager. Die Installation weiterer Software ist ohne wirklich eine qual. Damit ist es keine wirkliche, belastbare Option.
Eine andere Distribution namens Alpine Linux adressiert genau dieses Problem.
Es basiert auf BusyBox und fügt diesem Linux einen einfachen Paketmanager namens „apk“ hinzu.
Lange Rede, kurzer Sinn, habe ich diese Schritte in meinem lokalen Workspace durchgeführt:
mkdir alpinlinux cd alpinlinux/ mkdir root curl -sSL http://nl.alpinelinux.org/alpine/latest-stable/main/x86_64/apk-tools-static-$(curl \ -sSL http://nl.alpinelinux.org/alpine/latest-stable/main/x86_64/APKINDEX.tar.gz | \ tar -Oxz | \ grep --text '^P:apk-tools-static$' -A1 | \ tail -n1 | \ cut -d: -f2).apk | \ tar -xz -C . sbin/apk.static ./sbin/apk.static \ --repository http://nl.alpinelinux.org/alpine/latest-stable/main/ \ --update-cache \ --allow-untrusted \ --root ./root \ --initdb add alpine-base echo "http://nl.alpinelinux.org/alpine/latest-stable/main/" > ./root/etc/apk/repositories echo "http://nl.alpinelinux.org/alpine/latest-stable/community/" >> ./root/etc/apk/repositories tar --numeric-owner -C root -c . | docker import - alpine:0
Jetztist das Basisimage von Alpine Linux für Docker schon fertig.
Natürlich habe ich mein Image auf Docker Hub veröffentlicht. So könnt ihr es verwenden, testen und damit rumspielen: https://hub.docker.com/r/bundeskanzler4711/alpine-base/
Schritt 2
Als zweiten Schritt habe ich darauf basierend ein kleines OpenJDK 8 JRE-Image erstellt. Dafür habe ich das folgende kleine Dockerfile
benutzt:
FROM bundeskanzler4711/alpine-base:latest RUN apk add --no-cache openjdk8-jre
Ja genau, das war es schon 🙂
Nach ein paar Sekunden war mein Image auch schon fertig gebaut:
$ docker build -t bundeskanzler4711/alpine-base:0-java8 . Sending build context to Docker daemon 2.048 kB Step 1 : FROM bundeskanzler4711/alpine-base:latest ---> 3337a006116b Step 2 : RUN apk add --no-cache openjdk8-jre ---> Running in 30bd48d54d95 fetch http://nl.alpinelinux.org/alpine/latest-stable/main/x86_64/APKINDEX.tar.gz fetch http://nl.alpinelinux.org/alpine/latest-stable/community/x86_64/APKINDEX.tar.gz (1/24) Installing libffi (3.2.1-r2) (2/24) Installing libtasn1 (4.7-r0) (3/24) Installing p11-kit (0.23.1-r1) (4/24) Installing p11-kit-trust (0.23.1-r1) (5/24) Installing openssl (1.0.2g-r0) (6/24) Installing ca-certificates (20160104-r2) (7/24) Installing java-cacerts (1.0-r0) (8/24) Installing libxau (1.0.8-r1) (9/24) Installing libxdmcp (1.1.2-r1) (10/24) Installing libxcb (1.11.1-r0) (11/24) Installing libx11 (1.6.3-r2) (12/24) Installing libxext (1.3.3-r1) (13/24) Installing libxi (1.7.5-r0) (14/24) Installing libxrender (0.9.9-r1) (15/24) Installing libxtst (1.2.2-r0) (16/24) Installing libpng (1.6.20-r0) (17/24) Installing freetype (2.6.2-r0) (18/24) Installing libgcc (5.3.0-r0) (19/24) Installing giflib (5.1.1-r0) (20/24) Installing openjdk8-jre-lib (8.72.15-r2) (21/24) Installing java-common (0.1-r0) (22/24) Installing alsa-lib (1.1.0-r1) (23/24) Installing openjdk8-jre-base (8.72.15-r2) (24/24) Installing openjdk8-jre (8.72.15-r2) Executing busybox-1.24.1-r7.trigger Executing ca-certificates-20160104-r2.trigger Executing java-common-0.1-r0.trigger OK: 106 MiB in 40 packages ---> 3b0ce8bcd143 Removing intermediate container 30bd48d54d95 Successfully built 3b0ce8bcd143
Ich bin sehr stolz. 😉
Und: es funktioniert WIRKLICH:
$ docker run bundeskanzler4711/alpine-base:latest-java8 java -version openjdk version "1.8.0_72-internal" OpenJDK Runtime Environment (build 1.8.0_72-internal-alpine-r2-b15) OpenJDK 64-Bit Server VM (build 25.72-b15, mixed mode)
Wie oben beschrieben, findet ihr alle Images auf Docker Hub (https://hub.docker.com/u/bundeskanzler4711/).