In Dockerfiles gibt es zwei Befehle, die mir ähnlich sehen: CMD
und ENTRYPOINT
. Aber ich denke, dass es einen (subtilen?) Unterschied zwischen ihnen gibt - sonst wäre es nicht sinnvoll, zwei Befehle für genau dasselbe zu haben.
In der Dokumentation heißt es für CMD
Der Hauptzweck einer CMD besteht darin, Standardeinstellungen für einen ausführenden Container bereitzustellen.
und für ENTRYPOINT
:
Mit ENTRYPOINT können Sie einen Container konfigurieren, den Sie als ausführbare Datei ausführen können.
Was ist der Unterschied zwischen diesen beiden Befehlen?
ADD
undCOPY
Antworten:
Docker verfügt über einen Standardeinstiegspunkt, der
/bin/sh -c
jedoch keinen Standardbefehl enthält.Wenn Sie Docker wie
docker run -i -t ubuntu bash
folgt ausführen : Der Einstiegspunkt ist der Standardwert/bin/sh -c
, das Image istubuntu
und der Befehl istbash
.Der Befehl wird über den Einstiegspunkt ausgeführt. dh die eigentliche Sache, die ausgeführt wird, ist
/bin/sh -c bash
. Dadurch konnte DockerRUN
schnell implementieren , indem er sich auf den Parser der Shell stützte.Später fragten die Leute, ob sie dies anpassen könnten,
ENTRYPOINT
und--entrypoint
wurden vorgestellt.Alles nach
ubuntu
dem obigen Beispiel ist der Befehl und wird an den Einstiegspunkt übergeben. Wenn Sie dieCMD
Anweisung verwenden, ist es genau so, als ob Sie es tun würdendocker run -i -t ubuntu <cmd>
.<cmd>
wird der Parameter des Einstiegspunkts sein.Sie erhalten das gleiche Ergebnis auch, wenn Sie stattdessen diesen Befehl eingeben
docker run -i -t ubuntu
. Sie werden weiterhin eine Bash-Shell im Container starten, da die Ubuntu-Docker-Datei eine Standard-CMD angegeben hat:CMD ["bash"]
Da alles an den Einstiegspunkt übergeben wird, können Sie Ihre Bilder sehr gut verhalten. @Jiri Beispiel ist gut, es zeigt, wie man ein Bild als "binär" verwendet. Wenn Sie
["/bin/cat"]
als Einstiegspunkt verwenden und dann tundocker run img /etc/passwd
, erhalten Sie es,/etc/passwd
ist der Befehl und wird an den Einstiegspunkt übergeben, so dass die Ausführung des Endergebnisses einfach ist/bin/cat /etc/passwd
.Ein anderes Beispiel wäre, einen beliebigen Cli als Einstiegspunkt zu haben. Wenn Sie beispielsweise ein Redis-Image haben, anstatt es auszuführen
docker run redisimg redis -H something -u toto get key
, können Sie es einfach habenENTRYPOINT ["redis", "-H", "something", "-u", "toto"]
und dann wie folgt ausführen, um dasselbe Ergebnis zu erzielen :docker run redisimg get key
.quelle
ENTRYPOINT
; Ob eine Shell verwendet wird, hängt von der verwendeten Form desCMD
Befehls ab ( docs.docker.com/engine/reference/builder/#cmd ).CMD
vs hinzufügenENTRYPOINT
.Das
ENTRYPOINT
gibt einen Befehl an, der immer ausgeführt wird, wenn der Container gestartet wird.Das
CMD
gibt Argumente an, die dem zugeführt werdenENTRYPOINT
.Wenn Sie ein Bild für einen bestimmten Befehl erstellen möchten, verwenden Sie
ENTRYPOINT ["/path/dedicated_command"]
Wenn Sie andernfalls ein Bild für allgemeine Zwecke erstellen möchten, können Sie es
ENTRYPOINT
nicht angeben und verwenden,CMD ["/path/dedicated_command"]
da Sie die Einstellung überschreiben können, indem Sie Argumente an angebendocker run
.Zum Beispiel, wenn Ihre Docker-Datei:
Wenn Sie das Image ohne Argument ausführen, wird ein Ping an den lokalen Host gesendet:
Wenn Sie das Bild jetzt mit einem Argument ausführen, wird das Argument gepingt:
Zum Vergleich, wenn Ihre Docker-Datei:
Wenn Sie das Image ohne Argument ausführen, wird ein Ping an den lokalen Host gesendet:
Wenn Sie das Image jedoch mit einem Argument ausführen, wird das folgende Argument ausgeführt:
Weitere Informationen finden Sie in diesem Artikel von Brian DeHamer: https://www.ctl.io/developers/blog/post/dockerfile-entrypoint-vs-cmd/
quelle
The ENTRYPOINT specifies a command that will always be executed when the container starts. The CMD specifies arguments that will be fed to the ENTRYPOINT.
ist eine gute Zusammenfassung.Laut Docker docs ,
Die folgende Tabelle zeigt, welcher Befehl für verschiedene
ENTRYPOINT
/CMD
Kombinationen ausgeführt wird :- -
No ENTRYPOINT
- -
ENTRYPOINT exec_entry p1_entry
- -
ENTRYPOINT [“exec_entry”, “p1_entry”]
quelle
/bin/sh -c
involviert ist?/bin/sh -c
CMD als Präfix hinzugefügt wird, während CMD in ausführbarer Syntax (nicht Listensyntax) geschrieben wird.ENTRYPOINT exec_entry p1_ent
wurde falsch erklärt. Das Shell-Formular verhindert, dass CMD- oder Run-Befehlszeilenargumente verwendet werden - docs.docker.com/engine/reference/builder/#entrypointJa, das ist eine gute Frage. Ich verstehe es noch nicht ganz, aber:
Ich verstehe, dass dies
ENTRYPOINT
die Binärdatei ist, die ausgeführt wird. Sie können den Einstiegspunkt mit --entrypoint = "" überschreiben.CMD ist das Standardargument für Container. Ohne Einstiegspunkt ist das Standardargument der Befehl, der ausgeführt wird. Beim Einstiegspunkt wird cmd als Argument an den Einstiegspunkt übergeben. Sie können einen Befehl mit Einstiegspunkt emulieren.
Der Hauptvorteil besteht also darin, dass Sie mit dem Einstiegspunkt Argumente (cmd) an Ihren Container übergeben können. Um dies zu erreichen, müssen Sie beide verwenden:
und
dann können Sie verwenden:
quelle
docker run image_name -h
, um einige Hilfeinformationen dieses Bildes anzuzeigen.Unterschied zwischen CMD und ENTRYPOINT durch Intuition :
Ja, es ist durcheinander.
Sie können jeden von ihnen überschreiben, wenn Sie Docker ausführen.
Unterschied zwischen CMD und ENTRYPOINT am Beispiel :
Mehr zum Unterschied zwischen
CMD
undENTRYPOINT
:Argumente
docker run
wie / bin / bash überschreiben alle CMD-Befehle, die wir in Dockerfile geschrieben haben.ENTRYPOINT kann zur Laufzeit nicht mit normalen Befehlen wie z
docker run [args]
. Dieargs
am Ende vondocker run [args]
werden als Argumente für ENTRYPOINT bereitgestellt. Auf diese Weise können wir eine erstellen,container
die einer normalen Binärdatei wie zls
.CMD kann also als Standardparameter für ENTRYPOINT fungieren, und dann können wir die CMD-Argumente von [Argumente] überschreiben.
ENTRYPOINT kann mit überschrieben werden
--entrypoint
.quelle
In einer Nussschale:
Wenn Sie weitere Details benötigen oder einen Unterschied zum Beispiel sehen möchten, gibt es einen Blog-Beitrag, in dem CMD und ENTRYPOINT umfassend mit vielen Beispielen verglichen werden - http://goinbigdata.com/docker-run-vs-cmd-vs-entrypoint/
quelle
Ich werde meine Antwort als Beispiel 1 hinzufügen , um Ihnen zu helfen, den Unterschied besser zu verstehen.
Angenommen, wir möchten ein Image erstellen, das beim Start immer einen Schlafbefehl ausführt. Wir erstellen unser eigenes Image und geben einen neuen Befehl an:
Jetzt bauen wir das Bild:
Was ist, wenn wir die Anzahl der Sekunden ändern möchten? Wir müssten das ändern,
Dockerfile
da der Wert dort fest codiert ist, oder den Befehl überschreiben, indem wir einen anderen angeben:Dies funktioniert zwar, ist aber keine gute Lösung, da wir einen redundanten "Schlaf" -Befehl haben (der Zweck des Containers besteht darin, zu schlafen , daher
sleep
ist es keine gute Praxis , den Befehl explizit anzugeben ).Versuchen wir nun, die
ENTRYPOINT
Anweisung zu verwenden:Diese Anweisung gibt das Programm an, das beim Starten des Containers ausgeführt wird .
Jetzt können wir laufen:
Was ist mit einem Standardwert? Nun, Sie haben es richtig erraten:
Das
ENTRYPOINT
ist das Programm, das ausgeführt wird, und der an den Container übergebene Wert wird an diesen angehängt.Das
ENTRYPOINT
kann durch Angabe eines--entrypoint
Flags überschrieben werden , gefolgt von dem neuen Einstiegspunkt, den Sie verwenden möchten.Nicht meins, ich habe mir einmal ein Tutorial angesehen, das dieses Beispiel lieferte
quelle
Die akzeptierte Antwort ist fabelhaft in der Erklärung der Geschichte. Ich finde, diese Tabelle erklärt es sehr gut aus dem offiziellen Dokument über die Interaktion von CMD und ENTRYPOINT :
quelle
Kommentare zur EntryPoint-Funktion im Code
Ein weiterer Hinweis aus Dokumenten
Beispiel:
Build : sudo docker build -t ent_cmd.
.
ps: Bei Vorhandensein von EntryPoint enthält CMD Argumente, die an EntryPoint weitergeleitet werden sollen. In Abwesenheit von EntryPoint ist CMD der Befehl, der ausgeführt wird.
quelle
CMD
Der in derDockerfile
Datei erwähnte Befehl kann über dendocker run
Befehl überschrieben werden, währendENTRYPOINT
dies nicht möglich ist.quelle
docker run --help
Befehl sagt anders:--entrypoint string Overwrite the default ENTRYPOINT of the image
Ich habe alle Antworten gelesen und möchte zum besseren Verständnis auf den ersten Blick Folgendes zusammenfassen:
Erstens besteht der gesamte Befehl, der im Container ausgeführt wird, aus zwei Teilen: dem Befehl und den Argumenten
Im Kubernetes In Action- Buch wird ein wichtiger Hinweis dazu gegeben. (Kapitel 7)
Sie können diesen Artikel auch auf einfache Weise lesen, um eine gute Erklärung zu erhalten
quelle
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
wird vom ersten Prozess gegabelt.CMD ["param1","param2"]
: Dieses Formular wird verwendet, um Standardargumente für bereitzustellenENTRYPOINT
.ENTRYPOINT (In der folgenden Liste wird der Fall nicht berücksichtigt, in dem CMD und ENTRYPOINT zusammen verwendet werden):
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
wird vom ersten Prozess gegabelt.Wie Creack sagte, wurde CMD zuerst entwickelt. Dann wurde ENTRYPOINT für weitere Anpassungen entwickelt. Da sie nicht zusammen entworfen wurden, gibt es einige Funktionsüberschneidungen zwischen CMD und ENTRYPOINT, die Menschen oft verwirren.
quelle
Die meisten Leute erklären es hier perfekt, deshalb werde ich nicht alle Antworten wiederholen. Aber um ein gutes Gefühl zu bekommen, würde ich vorschlagen, es selbst zu testen, indem Sie sich die Prozesse im Container ansehen.
Erstellen Sie eine winzige Docker-Datei des Formulars:
Erstellen Sie es, führen Sie es mit aus
docker run -it theimage
und führen Sie esps -eo ppid,pid,args
im Container aus. Vergleichen Sie diese Ausgabe mit der Ausgabe, die Sie von ps erhalten, wenn Sie Folgendes verwenden:docker run -it theimage bash
ENTRYPOINT /bin/bash
und führen Sie es auf beide Arten ausCMD ["/bin/bash"]
Auf diese Weise können Sie die Unterschiede zwischen allen möglichen Methoden leicht selbst erkennen.
quelle
Die offizielle Dokumentation der Best Practices von Dockerfile erklärt die Unterschiede hervorragend. Best Practices für Dockerfile
CMD:
Die CMD-Anweisung sollte verwendet werden, um die in Ihrem Image enthaltene Software zusammen mit allen Argumenten auszuführen. CMD sollte fast immer in Form von verwendet werden
CMD ["executable", "param1", "param2"…]
. Wenn das Image also für einen Dienst wie Apache und Rails bestimmt ist, würden Sie so etwas wie ausführenCMD ["apache2","-DFOREGROUND"]
. In der Tat wird diese Form der Anweisung für jedes service-basierte Image empfohlen.EINSTIEGSPUNKT:
Die beste Verwendung für ENTRYPOINT besteht darin, den Hauptbefehl des Bildes festzulegen, sodass das Bild so ausgeführt werden kann, als wäre es dieser Befehl (und dann CMD als Standardflags verwenden).
quelle