Docker 2024 04/Image
Docker Images bilden die Grundlage um Container zu erstellen. Diese können selbst erstellt werden oder über eine Registry geholt werden.
Um ein Image zu erstellen wird ein Dockerfile benötigt. Dieses hat standardmäßig den Dateinamen Dockerfile.
Aufbau des Dockerfiles
Baseimage
Jedes Dockerfile wird von einem Baseimage abgeleitet. Dies kann ein eigens erstelltes Image sein, wie bereits in den vorhergehenden Kapiteln gezeigt wurde. Oder es kann eines der populären Baseimages verwendet werden:
- Ubuntu
- Alpine
- Busybox
Diese unterscheiden sich maßgeblich durch ihren Funktionsumfang (welche Tools bereits installiert sind). Dadurch verändert sich natürlich die Größe des selbst erstellten Images. Am besten wird das Baseimage gewählt mit dem man am meisten Erfahrung hat.
Es sei angemerkt, dass das Baseimage auch selbst erstellt werden kann (warum auch immer).[1]
Dockerfiles können auch Mehrstufig (multi-stage) aufgebaut sein. Z.b.: Eine Build Stage und eine Stage für das eigentlich Image.[2]
Dockerfile
FROM ubuntu:22.04
Dies stellt bereits ein gültiges Image dar. Die Sinnhaftigkeit sei jedoch in Frage gestellt.
Command und Entrypoint
Im Regelfall soll ein Container auch eine Applikation ausführen, ansonsten wird dieser direkt nach dem Starten gestoppt.
Hierfür gibt es zwei verschiedene Möglichkeiten:
- CMD
- Kann durch
docker run [container] [new command]ersetzt werden - Kann in abgeleitetem Image durch
ENTRYPOINToderCMDersetzt werden
- Kann durch
- ENTRYPOINT
- Es können über
docker run [container] [new command]Parameter für den Entrypoint hinzugefügt werden - Kann in abgeleitetem Image ersetzt werden, dies scheint aber keine best practice zu sein
- Es können über
Mittels Entrypoint kann sichergestellt werden, dass eine gewisse Applikation gestartet wird, in jedem Fall.
Der Entrypoint kann in einem abgeleiteten Image ebenfalls ersetzt werden. Die Vorgehensweise ist aber etwas sonderbar:
ENTRYPOINT ["/usr/bin/env"]
CMD ["..."]
Dockerfile - CMD
FROM ubuntu:22.04
CMD ["ls", "-l"]
docker build . -t dockerschulung/image_basics_1:1.0
# CMD des Dockerfiles verwenden
docker run --rm dockerschulung/image_basics_1:1.0
# CMD des Dockerfiles überschreiben
docker run --rm dockerschulung/image_basics_1:1.0 echo hallo
Dockerfile - ENTRYPOINT
FROM ubuntu:22.04
ENTRYPOINT ["ls", "-l"]
docker build . -t dockerschulung/image_basics_2:1.0
# ENTRYPOINT des Dockerfiles verwenden
docker run --rm dockerschulung/image_basics_2:1.0
# ENTRYPOINT des Dockerfiles ergänzen
docker run --rm dockerschulung/image_basics_2:1.0 -a
Weitere Befehle
- RUN
Befehl ausführen
- COPY Dateien/Ordner vom Host kopieren
- WORKDIR Das Arbeitsverzeichnis wechseln
- USER Benutzer wechseln (dieser muss über useradd erstellt werden)
- EXPOSE Exponierten Port festlegen, siehe {{docker run -p [Portnummer]}}, der Sinn erschließt sich mir nicht
- ARG Umgebungsvariable nur gültig während des Build Prozesses[4]
- ENV Umgebungsvariable gültig währen des Build Prozesses und zur Laufzeit[5]
- ↑ https://docs.docker.com/build/building/base-images/
- ↑ https://docs.docker.com/build/building/multi-stage/
- ↑ https://stackoverflow.com/questions/41207522/docker-override-or-remove-entrypoint-from-a-base-image
- ↑ https://vsupalov.com/docker-arg-env-variable-guide/
- ↑ https://vsupalov.com/docker-arg-env-variable-guide/