In diesem dritten Teil der Artikel-Serie für Anfänger wird gezeigt, wie man ein selbstgebautes Docker-Image als Basis-Image verwendet.
Eigenes Docker Image als Basis benutzen
Unser selbst gebautes Image verhält sich genau so, wie alle anderen Images auch. Die Nutzung und weitere Anpassung ist also identisch mit anderen Base Images.
Dockerfile
Schritt 1
Wenn das neue Image immer auf dem neuesten Stand von Debian jessie
basieren soll, kann dies einfach im Dockerfile
eingetragen werden.
In diesem Fall könnte es zum Beispiel so aussehen:
FROM bundeskanzler4711/jessie-minbase:latest
RUN apt-get -y update
RUN apt-get -y --force-yes dist-upgrade
RUN apt-get -y --force-yes autoremove
RUN apt-get clean
Schritt 2
Zum Ausführen des Dockerfile
wechseln wir in das Verzeichnis, in dem sich die Datei befindet, und führen folgendes aus:
me@mydebianbox:~/docker# docker build -t jessie-minbase-test-1 . Sending build context to Docker daemon 2.048 kB Step 1 : FROM bundeskanzler4711/jessie-minbase:latest ---> fe6449c63150 Step 2 : RUN apt-get -y update ---> Running in 6fe6c3322ea7 Ign http://ftp.de.debian.org jessie InRelease Hit http://ftp.de.debian.org jessie Release.gpg Hit http://ftp.de.debian.org jessie Release Get:1 http://ftp.de.debian.org jessie/main amd64 Packages [6763 kB] Get:2 http://ftp.de.debian.org jessie/main Translation-en [4582 kB] Fetched 11.3 MB in 14s (790 kB/s) Reading package lists... ---> 3d19b912a922 Removing intermediate container 6fe6c3322ea7 Step 3 : RUN apt-get -y --force-yes dist-upgrade ---> Running in 5aa0a49c1f56 Reading package lists... Building dependency tree... 0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded. ---> 6674a4c2e6e2 Removing intermediate container 5aa0a49c1f56 Step 4 : RUN apt-get -y --force-yes autoremove ---> Running in a083000e1b6b Reading package lists... Building dependency tree... 0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded. ---> b368380f8490 Removing intermediate container a083000e1b6b Step 5 : RUN apt-get clean ---> Running in 1698a5360db7 ---> 3a80b3f0cb76 Removing intermediate container 1698a5360db7 Successfully built 3a80b3f0cb76 me@mydebianbox:~/docker#
Schritt 3
So weit, so gut. Aber was passiert, wenn wir es ein zweites Mal ausführen? Alles wird nochmal genau so durchlaufen, oder?
me@mydebianbox:~/docker# docker build -t jessie-minbase-test-2 . Sending build context to Docker daemon 2.048 kB Step 1 : FROM bundeskanzler4711/jessie-minbase:latest ---> fe6449c63150 Step 2 : RUN apt-get -y update ---> Using cache ---> 3d19b912a922 Step 3 : RUN apt-get -y --force-yes dist-upgrade ---> Using cache ---> 6674a4c2e6e2 Step 4 : RUN apt-get -y --force-yes autoremove ---> Using cache ---> b368380f8490 Step 5 : RUN apt-get clean ---> Using cache ---> 3a80b3f0cb76 Successfully built 3a80b3f0cb76 me@mydebianbox:~/docker#
Wow, echt schnell!
Die IMAGE ID
s sind jedoch die gleichen wie im ersten Lauf.
Mit anderen Worten: Es wurde nichts ausgeführt, da Docker feststellt, dass diese Schritte bereits ausgeführt wurden.
Docker hat natürlich recht. Dies ist jedoch nicht das Verhalten, das wir erwartet haben.
Um die erneute Ausführung der Schritte in der Docker-Datei zu erzwingen, muss der Parameter --no-cache=true
an den Docker-Befehl übergeben werden.
me@mydebianbox:~/docker# docker build --no-cache=true -t jessie-minbase-test-3 . Sending build context to Docker daemon 2.048 kB Step 1 : FROM bundeskanzler4711/jessie-minbase:latest ---> fe6449c63150 Step 2 : RUN apt-get -y update ---> Running in bc9eaa66570a Ign http://ftp.de.debian.org jessie InRelease Hit http://ftp.de.debian.org jessie Release.gpg Hit http://ftp.de.debian.org jessie Release Get:1 http://ftp.de.debian.org jessie/main amd64 Packages [6763 kB] Get:2 http://ftp.de.debian.org jessie/main Translation-en [4582 kB] Fetched 11.3 MB in 13s (869 kB/s) Reading package lists... ---> 1e538f7d94cd Removing intermediate container bc9eaa66570a Step 3 : RUN apt-get -y --force-yes dist-upgrade ---> Running in 8c5dbcb27c12 Reading package lists... Building dependency tree... 0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded. ---> e97943aa5c2f Removing intermediate container 8c5dbcb27c12 Step 4 : RUN apt-get -y --force-yes autoremove ---> Running in 4a4884672e20 Reading package lists... Building dependency tree... 0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded. ---> fedbe2fd18da Removing intermediate container 4a4884672e20 Step 5 : RUN apt-get clean ---> Running in 75d1aa74a5b0 ---> 08c991fb2ee8 Removing intermediate container 75d1aa74a5b0 Successfully built 08c991fb2ee8 me@mydebianbox:~/docker#
Schritt 4
Ja, genau so haben wir das erwartet. Zum Schluss fehlt jetzt nur noch: Tag setzen und Image pushen
me@mydebianbox:~/docker# docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE jessie-minbase-test-3 latest 08c991fb2ee8 About a minute ago 260.6 MB jessie-minbase-test-2 latest 8a8479e7af79 2 minutes ago 260.6 MB jessie-minbase-test-1 latest 3a80b3f0cb76 10 minutes ago 260.6 MB bundeskanzler4711/jessie-minbase 8.3 bca6396f92bf 2 hours ago 157.6 MB bundeskanzler4711/jessie-minbase latest bca6396f92bf 2 hours ago 157.6 MB jessie-minbase latest bca6396f92bf 2 hours ago 157.6 MB
me@mydebianbox:~/docker# docker tag 08c991fb2ee8 bundeskanzler4711/jessie-minbase:latest Error response from daemon: Conflict: Tag bundeskanzler4711/jessie-minbase:latest is already set to image fe6449c63150, if you want to replace it, please use -f option me@mydebianbox:~/docker# docker tag -f 08c991fb2ee8 bundeskanzler4711/jessie-minbase:latest
me@mydebianbox:~/docker# docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE bundeskanzler4711/jessie-minbase latest 08c991fb2ee8 3 minutes ago 260.6 MB jessie-minbase-test-3 latest 08c991fb2ee8 3 minutes ago 260.6 MB jessie-minbase-test-2 latest 8a8479e7af79 3 minutes ago 260.6 MB jessie-minbase-test-1 latest 3a80b3f0cb76 11 minutes ago 260.6 MB bundeskanzler4711/jessie-minbase 8.3 bca6396f92bf 2 hours ago 157.6 MB jessie-minbase latest bca6396f92bf 2 hours ago 157.6 MB
me@mydebianbox:~/docker# docker push bundeskanzler4711/jessie-minbase The push refers to a repository [docker.io/bundeskanzler4711/jessie-minbase] (len: 1) 08c991fb2ee8: Pushed fedbe2fd18da: Pushed e97943aa5c2f: Pushed 1e538f7d94cd: Pushed fe6449c63150: Image already exists latest: digest: sha256:b2fb47f468659f2b99d15b4b70b30454b0470b2df7fdb3e465a614bd19d1db95 size: 7488 me@mydebianbox:~/docker#
Und schon ist alles erledigt!
Im nächsten Teil sehen wir uns an, wie wir ein eigenes Java-Basis-Image bauen, das wir immer wieder für unsere Applikationen nutzen können.