Frage Mehrere Befehle in der Docker CMD-Direktive


Ich verstehe nicht, was passiert, wenn ich versuche, zwei Befehle zur Laufzeit über die CMD-Direktive in `Dockerfile 'auszuführen. Ich ging davon aus, dass dies funktionieren sollte:

CMD ["/etc/init.d/nullmailer", "start", ";", "/usr/sbin/php5-fpm"]

Aber es funktioniert nicht. Der Container wurde nicht gestartet. Also musste ich es so machen:

CMD ["sh", "-c", "/etc/init.d/nullmailer start ; /usr/sbin/php5-fpm"]

Ich verstehe es nicht. Warum das? Warum ist die erste Zeile nicht der richtige Weg? Kann mir jemand diese "CMD-Shell-Format vs JSON-Format, etc" Zeug erklären. In einfachen Worten.

Nur zu beachten - das gleiche war mit command: Richtlinie in docker-compose.yml, wie erwartet.


25
2018-04-26 18:08


Ursprung




Antworten:


Ich glaube, der Unterschied könnte damit zu tun haben, dass der zweite Befehl die Shell-Verarbeitung ausführt, während der erste dies nicht tut. Für den Beamten Dokumentation , dort ist der exec und shell Form, Ihr erster Befehl ist ein Exec-Formular und es erweitert nicht zum Beispiel Umgebungsvariablen, während der zweite es tut. Es ist also möglich, dass der Befehl aufgrund der Abhängigkeit von der Shell-Verarbeitung fehlschlägt. Sie können dies überprüfen, indem Sie ausführen docker logs CONTAINERID

Ihr zweiter Befehl, die Shell-Form, entspricht -

CMD /etc/init.d/nullmailer start ; /usr/sbin/php5-fpm

Auszüge aus der Dokumentation -

Anmerkung: Im Gegensatz zur Shell-Form ruft das Exec-Formular keine Befehlsshell auf. Dies bedeutet, dass normale Shell-Verarbeitung nicht stattfindet. Zum Beispiel, CMD [ "echo", "$HOME" ] führt keine Variablensubstitution durch $HOME. Wenn Sie eine Shell-Verarbeitung wünschen, verwenden Sie entweder das Shell-Formular oder führen Sie direkt eine Shell aus, zum Beispiel: CMD [ "sh", "-c", "echo", "$HOME" ].


21
2018-04-27 04:25



Wahrscheinlich ist der Befehl aufgrund von Umgebungsvariablen fehlgeschlagen. Sollte ich das noch benutzen? exec Form, wie es die bevorzugte Form ist? Warum ist es bevorzugt? Oder sollte ich einfacher verwenden shell bilden? - Vladan
Es ist fehlgeschlagen, weil die Ausführung eines Befehls nach dem anderen eine Shell-Funktion ist. Umgebungsvariablen ist ein Ablenkungsmanöver. - Bryan
Wenn Sie mehrere Dienste in Docker ausführen, würde ich einen Prozessmanager wie Supervisor empfehlen. Auf diese Weise starten Sie nur Supervisord unter dem CMD-Abschnitt und es wird sich darum kümmern, die Dienste zu starten. Sie können hier nach Details suchen - docs.docker.com/articles/using_supervisord - Daniel t.
Dies ist ein genauer Artikel, den ich gerade gelesen habe :) Danke. - Vladan
Ich verstehe immer noch nicht, warum du es tun musst CMD [ "sh", "-c", "echo", "$HOME"]. Warum nicht CMD ["sh", "-c", "echo $HOME"] oder, in der Tat, CMD ["sh -c echo $HOME"]? - sixty4bit


Ich schätze, der erste Befehl schlägt fehl, weil in der DOCKER CMD-Form nur der erste Parameter ausgeführt wird, der Rest wird in diesen Befehl eingegeben.

Die zweite Form funktioniert, weil alle Befehle mit ";" getrennt sind. werden in den sh-Befehl eingegeben, der sie ausführt.


1
2017-12-01 15:06





Ich glaube nicht, dass du nach "Start" Semikomma setzen solltest

anstatt zu verwenden

CMD ["/etc/init.d/nullmailer", "start", ";", "/usr/sbin/php5-fpm"]

Versuchen

CMD ["/etc/init.d/nullmailer", "start", "/usr/sbin/php5-fpm"]

Da Docker "sh -c" verwendet, wird der obige Befehl wie folgt ausgeführt

/etc/init.d/nullmailer start
/etc/init.d/nullmailer /usr/sbin/php5-fpm

1
2017-12-07 17:42