Teil 3: Docker images from scratch

Teil 3: Docker images from scratch

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

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.