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

123

Ich möchte ein Docker-Image überprüfen, das von einer anderen Person mit einem angegebenen Entypoint und einem angegebenen Cmd erstellt wurde. Beispiel:

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

Derzeit mache ich:

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

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

Kette
quelle

Antworten:

126

Sie können einfach über eingeben docker run -it --entrypoint=/bin/bash $IMAGE -i(Sie starten einen neuen Container über das Image und erhalten eine Bash-Shell im interaktiven Modus) und dann den Befehl entrypoint in diesem Container ausführen.

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

BEARBEITEN: Seit Docker 1.3 können Sie execeinen Prozess in einem laufenden Container ausführen. Starten Sie Ihren Container wie gewohnt und geben Sie ihn ein, indem Sie Folgendes eingeben:

docker exec -it $CONTAINER_ID /bin/bash

Vorausgesetzt, bash ist installiert, erhalten Sie Shell-Zugriff auf den ausgeführten Container.

Panagiotis Moustafellos
quelle
Würde das nicht "/ usr / sbin / apache2ctl / bin / bash" ausführen? (Da Ihr Beispiel den Eintrittspunkt nicht überschreibt, wird der im Dockerfile definierte Eintrittspunkt verwendet - oder fehlt mir etwas?)
Warp
Ist das etwas, was für ältere / neuere Docker-Versionen vielleicht anders ist? Es läuft sicherlich der Entypoint für mich: gist.github.com/warpr/26a5cc471dce7fcf9021 . Dies verwendet Docker 0.10.0 unter Ubuntu 13.10.
Warp
4
Ich weiß, dass das Überschreiten eines Zwischenpunkts den Zwischenpunkt überschreibt. Aber wie kann ich CMD überschreiben, wenn ich --entrypoint verwende, um leer zu sein? (Für Bash kann ich so etwas wie -i oder --login verwenden, aber nicht alle Eintrittspunkte, die ich verwenden möchte, haben ein äquivalentes "Dummy" -Argument.)
Warp
1
Zumindest in Docker v1.11.1 scheint das Überschreiben des --entrypoints auch das normale Anhängen der CMD an den Entypoint zu verhindern. Dies scheint nur zu passieren, wenn der Eintrittspunkt nicht überschrieben wird.
Jasmine Hegman
1
Warum gibt es ein -iNachher $IMAGE?
Eyal Levin
27

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

Relevanter Teil:

CMD (Standardbefehl oder -optionen) Rufen Sie den optionalen Befehl in der Docker-Befehlszeile auf:

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

Dieser Befehl ist optional, da die Person, die das BILD erstellt hat, möglicherweise bereits einen Standardbefehl über die Dockerfile-CMD bereitgestellt hat. Als Operator (die Person, die einen Container im Image ausführt) können Sie diese CMD überschreiben, indem Sie einfach einen neuen BEFEHL angeben.

Wenn das Bild auch einen ENTRYPOINT angibt, wird die CMD oder der BEFEHL als Argument an den ENTRYPOINT angehängt.

Um zu tun, was Sie wollen, müssen Sie nur einen Befehl eingeben und ihn mit überschreiben /bin/bash. Nicht ganz "leer", aber zu 99% erledigt.

Simon Thum
quelle
Hoppla, ich habe ein Detail übersehen. Abgesehen von der Verkürzung --loginauf -lIch denke, Ihre Lösung ist bereits so gut wie es nur geht.
Simon Thum
Hier ist eine lustige Sache, die ich heute gesehen habe: Der Befehl wird nicht überschrieben, er wird angehängt. Hier ist die PS aus dem Container. Beachten Sie, dass der Befehl, den ich hinzugefügt habe, echo "setup the db" war und der eingebaute Befehl / usr / bin / geth ist. Außerdem habe ich den Entypoint auf "" gesetzt. 1 ? Ssl 0:00 /usr/bin/geth echo setting up db
Paul S
Der Docker-Referenzlink funktioniert nicht mehr - es kann kein offensichtlicher Ersatz dafür gefunden werden.
Chris Kimpton
Ich habe es gerade behoben, aber ich fand es auch schwer zu finden; (
Simon Thum
15

Für alle, die hierher kommen, um den Befehl entrypoint AND zu überschreiben, um einen anderen Befehl zu übergeben, z. B. bash anstelle des Skripts entrypoint ausführen und dann einen anderen Befehl mit Parametern ausführen (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 ...'Dieser Parameter gibt an, /bin/shdass Sie hier jeden Befehl übergeben können, den Sie im Container ausführen möchten. /bin/shist für alpine Bilder, /bin/basham wahrscheinlichsten für andere Bilder.

infro
quelle
1
Nur ein Addtion-Shell-Befehl sollte json-basiert geschrieben sein. Verwenden Sie also statt einfacher Anführungszeichen '...'doppelte Anführungszeichen"..."
Jimmy Obonyo Abor
Oder übergeben Sie einfach so viele Stichpunkte wie Sie möchten
Nick Roz
dies scheint nicht zu funktionieren: "exec: \" - c \ ": ausführbare Datei nicht in $ PATH gefunden": unbekannt.
Richard
Überprüfen Sie den Pfad im Container, vielleicht existiert er wirklich nicht. Die meisten Bilder haben, /bin/shaber deins ist möglicherweise nicht der Fall.
Infro