Was ist der Unterschied zwischen CMD und ENTRYPOINT in einer Dockerfile?
In Dockerfiles es gibt zwei Befehle, die ähnlich Aussehen wie ich: CMD
und ENTRYPOINT
. Aber ich denke, dass es eine (subtile?) der Unterschied zwischen Ihnen - sonst würde es keinen Sinn machen, zwei Befehle für die sehr gleiche Sache.
Gibt die Dokumentation für CMD
Den Hauptzweck einer CMD ist die Bereitstellung von Vorgaben für die Ausführung Behälter.
und für ENTRYPOINT
:
Einen ENTRYPOINT unterstützt Sie bei der Konfiguration eines Containers, dass Sie ausgeführt werden kann als eine ausführbare Datei.
So, was ist der Unterschied zwischen diesen beiden Befehlen?
InformationsquelleAutor der Frage Golo Roden | 2014-02-04
Du musst angemeldet sein, um einen Kommentar abzugeben.
Docker hat eine Standard entrypoint, die
/bin/sh -c
aber nicht über eine default-Befehl.Beim ausführen von docker wie diese:
docker run -i -t ubuntu bash
der entrypoint ist der Standard -
/bin/sh -c
, das Bild istubuntu
den Befehlbash
.Ausführen des Befehls über den entrypoint. d.h., die eigentliche Sache und ausgeführt wird, ist
/bin/sh -c bash
. Dies erlaubt Andockfenster zu implementierenRUN
schnell, indem Sie sich auf der shell-parser.Später, bat die Leute, um in der Lage sein, dies anzupassen, so
ENTRYPOINT
und--entrypoint
eingeführt wurden.Alles nach
ubuntu
im Beispiel oben ist die Befehls-und übergeben, entrypoint. Bei der Verwendung derCMD
Unterricht, es ist genau so, als ob Sie Tatendocker run -i -t ubuntu <cmd>
.<cmd>
werden die parameter der entrypoint.Erhalten Sie auch das gleiche Ergebnis, wenn Sie statt dessen diesen Befehl eingeben
docker run -i -t ubuntu
. Werden Sie noch starten Sie eine bash-shell in die container, weil der ubuntu Dockerfile angegebenen Standardwert CMD:CMD ["bash"]
Als alles, was übergeben wird, der entrypoint ist, können Sie ein sehr schönes Verhalten von Ihren Bildern. @Jiri Beispiel ist gut, er zeigt, wie man ein Bild als "binary". Bei der Verwendung von
["/bin/cat"]
als entrypoint und dann tutdocker run img /etc/passwd
Sie es bekommen,/etc/passwd
ist der Befehl und wird an den entrypoint, so das Ergebnis der Ausführung ist einfach/bin/cat /etc/passwd
.Anderes Beispiel wäre es, alle cli als entrypoint. Zum Beispiel, wenn Sie einen redis-Bild, anstatt zu laufen
docker run redisimg redis -H something -u toto get key
können Sie einfachENTRYPOINT ["redis", "-H", "something", "-u", "toto"]
und dann ausführen, wie dies für das gleiche Ergebnis:docker run redisimg get key
.InformationsquelleAutor der Antwort creack
Den
ENTRYPOINT
gibt einen Befehl an, der immer ausgeführt werden, wenn der container gestartet wird.Den
CMD
gibt Argumente, die zugeführt wird, um dieENTRYPOINT
.Wenn Sie möchten, ein Bild zu machen, einen eigenen Befehl, den Sie verwenden
ENTRYPOINT ["/path/dedicated_command"]
Andernfalls, wenn Sie möchten, um ein Bild für den Allgemeinen Zweck, lassen Sie
ENTRYPOINT
unbestimmten und verwendenCMD ["/path/dedicated_command"]
wie können Sie die Einstellung außer Kraft setzen, indem Sie liefern Argumente, umdocker run
.Zum Beispiel, wenn Ihr Dockerfile ist:
Läuft das Bild ohne argument wird die ping localhost:
Jetzt läuft das Bild mit einem argument, mit dem die ping-argument:
Zum Vergleich, wenn Ihr Dockerfile ist:
Läuft das Bild ohne argument wird die ping localhost:
Aber läuft das Bild mit einem argument ausgeführt, das argument:
Finden Sie in diesem Artikel von Brian DeHamer für noch mehr details:
https://www.ctl.io/developers/blog/post/dockerfile-entrypoint-vs-cmd/
InformationsquelleAutor der Antwort Daishi
Ja, das ist eine gute Frage. Ich verstehe es zwar nicht vollständig, aber:
Ich verstehe, dass
ENTRYPOINT
ist die binäre, der ausgeführt wird. Sie können diesen entrypoint-entrypoint="".CMD ist die Standard-argument, um den Behälter. Ohne entrypoint, Standard-argument ist der Befehl, der ausgeführt wird. Mit entrypoint, cmd übergeben wird, entrypoint als argument. Können Sie emulieren Sie den Befehl mit entrypoint.
So, der Hauptvorteil ist, dass mit entrypoint können Sie Argumente übergeben (cmd) auf den container. Um dies zu erreichen, müssen Sie verwenden beide:
und
dann können Sie verwenden:
InformationsquelleAutor der Antwort Jiri
Laut Andockfenster docs,
Den nachstehenden Tabellen zeigt welcher Befehl ausgeführt wird, für verschiedene
ENTRYPOINT
/CMD
Kombinationen:--
No ENTRYPOINT
--
ENTRYPOINT exec_entry p1_entry
--
ENTRYPOINT [“exec_entry”, “p1_entry”]
InformationsquelleAutor der Antwort Rafaf Tahsin
Kurz gesagt:
Wenn Sie weitere Einzelheiten benötigen oder möchten, um zu sehen Unterschied auf Beispiel, es ist ein blog-post, die umfassend vergleichen Sie CMD ein und ENTRYPOINT mit vielen Beispielen - http://goinbigdata.com/docker-run-vs-cmd-vs-entrypoint/
InformationsquelleAutor der Antwort upitau
Unterschied zwischen CMD und ENTRYPOINT durch intuition:
Ja, es ist die Vermischung.
Können Sie überschreiben alle von Ihnen beim ausführen von docker laufen.
Unterschied zwischen CMD und ENTRYPOINT von Beispiel:
Mehr auf den Unterschied zwischen
CMD
undENTRYPOINT
:Argument
docker run
wie /bin/bash überschreibt alle CMD-Befehl, den wir schrieb im Dockerfile.ENTRYPOINT kann nicht überschrieben werden, die zur Laufzeit mit normalen Befehle wie
docker run [args]
. Dieargs
am Endedocker run [args]
vorgesehen sind, die als Argumente an ENTRYPOINT. Auf diese Weise können wir einecontainer
die wie eine normale binäre wiels
.Also CMD als default-Parameter zu ENTRYPOINT, und dann können wir überschreiben die CMD args [args].
ENTRYPOINT überschrieben werden können mit
--entrypoint
.InformationsquelleAutor der Antwort Tomer Ben David
Die akzeptierte Antwort ist Fabelhaft, die die Geschichte erklären. Ich finde diese Tabelle erklären es sehr gut aus offizielle doc ', wie Sie CMD ein und ENTRYPOINT interagieren':
InformationsquelleAutor der Antwort Xiao Peng - ZenUML.com
Kommentare auf EntryPoint-Funktion in code
Andere Referenz von Dokumenten
Beispiel:
Bauen: sudo docker build-t ent_cmd .
.
p.s:
In Anwesenheit von EntryPoint, CMD halten wird, Argumente an die fed zu EntryPoint.
In Abwesenheit von EntryPoint, CMD wird der Befehl, welcher ausgeführt werden soll.
InformationsquelleAutor der Antwort Tahir Rauf
CMD:
CMD ["executable","param1","param2"]
:["executable","param1","param2"]
ist der erste Prozess.CMD command param1 param2
:/bin/sh -c CMD command param1 param2
ist der erste Prozess.CMD command param1 param2
ist entstanden aus dem ersten Prozess.CMD ["param1","param2"]
: Dieses Formular wird verwendet, um default-Argumente fürENTRYPOINT
.ENTRYPOINT (Die folgende Liste erhebt nicht den Fall betrachten, wo Sie CMD ein und ENTRYPOINT sind, zusammen verwendet):
ENTRYPOINT ["executable", "param1", "param2"]
:["executable", "param1", "param2"]
ist der erste Prozess.ENTRYPOINT command param1 param2
:/bin/sh -c command param1 param2
ist der erste Prozess.command param1 param2
ist entstanden aus dem ersten Prozess.Als creack sagte, CMD wurde zuerst entwickelt. Dann ENTRYPOINT wurde entwickelt für mehr Anpassung. Da Sie nicht gemeinsam entworfen, es gibt einige Funktionen, die überschneidungen zwischen CMD und ENTRYPOINT, die oft verwirren die Menschen.
InformationsquelleAutor der Antwort Jingguo Yao
Dies ist wahrscheinlich die beste Beschreibung, die ich gefunden habe:
Dockerfile: ENTRYPOINT vs CMD
Hatte ich eine Zusammenfassung hier, aber die Leute gehalten downvoting ohne Angabe von Gründen, also habe ich es gelöscht.
InformationsquelleAutor der Antwort Ondra Žižka