Frage Wie kann ich CMD überschreiben, wenn ein Docker-Image ausgeführt wird?


Ich möchte ein Docker-Bild untersuchen, das von einem anderen Benutzer erstellt wurde und für den sowohl ein Eintragspunkt als auch ein Cmd angegeben wurde. Beispiel:

ENTRYPOINT ["/usr/sbin/apache2ctl"]
CMD ["-D", "FOREGROUND"]

Ich mache derzeit:

docker run --interactive --tty --entrypoint=/bin/bash $IMAGE --login

Gibt es eine Möglichkeit CMD zu überschreiben, um leer zu sein (also muss ich nicht "--login" verwenden)?


82
2018-05-10 12:59


Ursprung




Antworten:


Sie könnten einfach via eingeben docker run -it --entrypoint=/bin/bash $IMAGE -i (Sie starten einen neuen Container aus dem Image und rufen eine Bash-Shell im interaktiven Modus ab). Führen Sie dann den Befehl entrepoint in diesem Container aus.

Sie können dann den laufenden Container in dem Zustand untersuchen, in dem er ausgeführt werden soll.

EDIT: Seit Docker 1.3 können Sie verwenden exec um einen Prozess in einem laufenden Container auszuführen. Starten Sie Ihren Container wie gewohnt und geben Sie ihn wie folgt ein:

docker exec -it $CONTAINER_ID /bin/bash

Wenn Bash installiert ist, erhalten Sie Shell-Zugriff auf den laufenden Container.


90
2018-05-12 09:28



Würde das nicht "/ usr / sbin / apache2ctl / bin / bash" ausführen? (Da Ihr Beispiel den Einstiegspunkt nicht überschreibt, wird der in der Dockerdatei definierte Einstiegspunkt verwendet - oder fehlt mir etwas?) - warp
Ist das etwas, das für ältere / neuere Docker-Versionen vielleicht anders ist? Es ist sicherlich der Einstiegspunkt für mich: gist.github.com/warpr/26a5cc471dce7fcf9021 . Dies verwendet docker 0.10.0 unter Ubuntu 13.10. - warp
Vorbeigehen -entrypoint Überschreibt den Einstiegspunkt. Siehe die bearbeitete Antwort - Panagiotis Moustafellos
Ich weiß, dass --entrypoint den Einstiegspunkt überschreibt. Aber wenn ich --entrypoint verwende, wie überschreibe ich CMD, um leer zu sein? (Für bash kann ich etwas wie -i oder --login verwenden, aber nicht alle Eingangspunkte, die ich verwenden möchte, haben ein äquivalentes "dummy" Argument). - warp
Zumindest in Docker v1.11.1 scheint das Überschreiben des --entrypoint auch das normale Anhängen des CMD an den Einstiegspunkt zu verhindern. Das scheint nur dann zu passieren, wenn der Einstiegspunkt nicht überschrieben wird. - Jasmine Hegman


Sehen: https://docs.docker.com/engine/reference/run/#overriding-dockerfile-image-defaults

Relevanter Teil:

CMD (Standardbefehl oder Optionen) Rufen Sie das optionale COMMAND in der Docker-Befehlszeile auf:

$ docker run [OPTIONS] IMAGE[:TAG] [COMMAND] [ARG...]

Dieser Befehl ist optional, da die Person, die das IMAGE erstellte, möglicherweise bereits einen Standardbefehl mithilfe des Dockerfile CMD bereitgestellt hat. Als Operator (die Person, die einen Container aus dem Image ausführt) können Sie diesen CMD überschreiben, indem Sie einfach einen neuen COMMAND angeben.

Wenn das Bild auch einen ENTRYPOINT angibt, werden CMD oder COMMAND als Argumente an den ENTRYPOINT angehängt.

Also zu tun, was du willst, brauchst du nur Geben Sie ein cmd an und überschreiben Sie mit /bin/bash. Nicht ganz "leer", aber es erledigt die Arbeit zu 99%.


19
2018-06-12 07:31



Ups, ich habe ein Detail übersehen. Außer zur Verkürzung --loginzu -l Ich schätze deine Lösung ist schon so gut wie es geht. - Simon Thum
Hier ist eine lustige Sache, die ich heute gesehen habe: Der Befehl wird nicht überschrieben, er wird angehängt. Hier ist der PS aus dem Container. Beachten Sie, dass der von mir hinzugefügte Befehl echo war, "die db eingerichtet" und der eingebaute Befehl ist / usr / bin / geth. Auch ich habe den Einstiegspunkt "" gesetzt. 1 ? Ssl 0:00 /usr/bin/geth echo setting up db - Paul S
Der Docker-Referenzlink funktioniert nicht mehr - kann keinen offensichtlichen Ersatz dafür finden. - Chris Kimpton
Ich habe es gerade repariert, aber ich fand es auch schwer es zu finden. - Simon Thum


Für jeden, der hierher kommt, um den Eintrittspunkt zu übersteuern UND einen anderen Befehl zu übergeben, z. Führen Sie bash anstelle von entrypoint script aus und führen Sie dann einen anderen Befehl mit Parametern aus (war mir aus anderen Antworten nicht klar):

 docker run [other options] --entrypoint '/bin/sh' $IMAGE -c 'npm link gulp gulp-sass gulp-sourcemaps'

-c 'npm link ...' ist Parameter für /bin/sh Hier können Sie also alle Befehle übergeben, die Sie im Container ausführen möchten. /bin/sh ist für alpine Bilder, /bin/bash wahrscheinlich für andere Bilder.


7
2018-05-04 07:28



nur eine Addon-Shell-Befehle sollten json-basiert geschrieben werden, also statt mit einfachen Anführungszeichen zu zitieren '...' Verwenden Sie doppelte Anführungszeichen "..." - Jimmy Obonyo Abor