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)?

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.


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.


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.


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.