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)