Docker Tutorial [Teil 8 - Entrypoint / CMD]

Datum

Ein CentOS Image hat in dem entsprechenden Dockerfile als letzten Befehl CMD ["/bin/bash"] zu stehen.
D.h. wenn ein Container aus diesem Image gebaut und gestartet wird, dann wird innerhalb des Containers /bin/sh -c /bin/bash ausgeführt und auch gleich wieder beendet.

Beispiel: docker run -d --name cmd_test01 centos

$ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                         PORTS               NAMES
092597f19693        centos              "/bin/bash"         5 seconds ago       Exited (0) 4 seconds ago                           cmd_test01

Dieser zuletzt ausgeführte CMD Befehl lässt sich durch die zusätzliche Angabe von Befehlen verändern, bzw. ersetzen:

$ docker run -it --name cmd_test02 centos cat /etc/redhat-release
CentOS Linux release 7.6.1810 (Core)
$ docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                      PORTS               NAMES
dcb0b2dbb88d        centos              "cat /etc/redhat-rel…"   26 seconds ago      Exited (0) 25 seconds ago                       cmd_test02
Entrypoint

Der Unterschied zu CMD liegt nun darin, dass ich diesen letzten Befehl festlege und dieser, während der Laufzeit, nicht einfach geändert werden kann.
Des weiteren kann ich den CMD Befehl verwenden um Standardwerte im Vorfeld zu definieren, welche sich ändern und erweitern lassen.

Hier mal ein paar Beispiele:

Dockerfile:

FROM centos:latest
ENTRYPOINT ["sleep"]
CMD ["3"]

Wenn ich mir daraus per docker build -t entrypoint_testimage:0.1 . ein Image baue…

$ docker images
REPOSITORY             TAG                 IMAGE ID            CREATED             SIZE
entrypoint_testimage   0.1                 fdf7dfdcb9ef        6 minutes ago       202MB

… und mir dann per docker run -d entrypoint_testimage:0.1 einen Container baue, so ist dieser für 3 Sekunden aktiv (sleep) und beendet sich dann:

$ docker ps -a
CONTAINER ID        IMAGE                      COMMAND             CREATED             STATUS                              PORTS               NAMES
fc6ff31c7432        entrypoint_testimage:0.1   "sleep 3"           3 seconds ago       Exited (0) Less than a second ago                       suspicious_goldwasser

Wenn ich nun hierbei zusätzliche Parameter beim Bau angebe, so verändern diese wieder den Wert des CMD Befehls, aber der ENTRYPOINT bleibt davon unangetastet:
docker run -d entrypoint_testimage:0.1 10

$ docker ps -a
CONTAINER ID        IMAGE                      COMMAND             CREATED             STATUS                     PORTS               NAMES
d30ba94f50f9        entrypoint_testimage:0.1   "sleep 10"          13 seconds ago      Exited (0) 1 second ago                        clever_mirzakhani
fc6ff31c7432        entrypoint_testimage:0.1   "sleep 3"           3 minutes ago       Exited (0) 3 minutes ago                       suspicious_goldwasser

Dies bedeutet auch das die zusätzlichen Parameter entsprechend zu dem Befehl im ENTRYPOINT passen müssen sonst ist der Container unbrauchbar:
docker run -d entrypoint_testimage:0.1 ls

$ docker ps -a
CONTAINER ID        IMAGE                      COMMAND             CREATED              STATUS                          PORTS               NAMES
1f7f7b941ff3        entrypoint_testimage:0.1   "sleep ls"          3 seconds ago        Exited (1) 1 second ago                             boring_darwin
d30ba94f50f9        entrypoint_testimage:0.1   "sleep 10"          About a minute ago   Exited (0) About a minute ago                       clever_mirzakhani
fc6ff31c7432        entrypoint_testimage:0.1   "sleep 3"           5 minutes ago        Exited (0) 5 minutes ago                            suspicious_goldwasser
Ändern des ENTRYPOINT

Der im Dockerfile hinterlegte ENTRYPOINT kann mit der Option --entrypoint beim bau eines Containers geändert werden.

Hierbei gilt es zu beachten, dass mit der --entrypoint Option nur der neue auszuführende Befehl angegeben wird und die entsprechenden Parameter regulär an das Ende des Befehls angehangen werden.

Beispiel (FALSCH):

$ docker run --entrypoint "cat /etc/redhat-release" entrypoint_testimage:0.1
docker: Error response from daemon: OCI runtime create failed: container_linux.go:345: starting container process caused "exec: \"cat /etc/redhat-release\": stat cat /etc/redhat-release: no such file or directory": unknown.
ERRO[0000] error waiting for container: context canceled 

Beispiel (RICHTIG):

$ docker run --entrypoint "/bin/cat" entrypoint_testimage:0.1 /etc/redhat-release
CentOS Linux release 7.6.1810 (Core)

Autor
Kategorien container, docker

PRTG Map