Ich möchte einen gestoppten Docker-Container mit einem anderen Befehl starten, da der Standardbefehl abstürzt. Dies bedeutet, dass ich den Container nicht starten und dann 'docker exec' verwenden kann.
Grundsätzlich möchte ich eine Shell starten, damit ich den Inhalt des Containers überprüfen kann.
Zum Glück habe ich den Container mit der Option -it erstellt!
inspect
Ausgabe in eine Konfiguration zu konvertieren, die beim nachfolgenden Lauf verwendet wird?Bearbeiten Sie diese Datei (entsprechend Ihrem gestoppten Container):
Ändern Sie den Parameter "Pfad" so, dass er auf Ihren neuen Befehl zeigt, z. B. / bin / bash. Sie können auch den Parameter "Args" festlegen, um Argumente an den Befehl zu übergeben.
Starten Sie den Docker-Dienst neu (beachten Sie, dass dadurch alle laufenden Container gestoppt werden):
Listen Sie Ihre Container auf und stellen Sie sicher, dass sich der Befehl geändert hat:
Starten Sie den Container und befestigen Sie ihn, Sie sollten jetzt in Ihrer Shell sein!
Arbeitete an Fedora 22 mit Docker 1.7.1.
HINWEIS: Wenn Ihre Shell nicht interaktiv ist (z. B. Sie haben den ursprünglichen Container nicht mit der Option -it erstellt), können Sie stattdessen den Befehl in "/ bin / sleep 600" oder "/ bin / tail -f / dev / null" ändern. um Ihnen genügend Zeit zu geben, "docker exec -it CONTID / bin / bash" als eine andere Möglichkeit zum Abrufen einer Shell auszuführen.
HINWEIS 2: Neuere Versionen von Docker haben config.v2.json, wo Sie entweder Entrypoint oder Cmd ändern müssen (danke user60561).
quelle
..."Path":"tail","Args":["-f","/dev/null"]...
config.v2.json
, wo Sie entwederEntrypoint
oder ändern müssenCmd
.Fügen Sie oben in Ihrem Entrypoint-Skript ein Häkchen hinzu
Docker muss dies wirklich als neue Funktion implementieren. Hier ist jedoch eine weitere Problemumgehungsoption für Situationen, in denen Sie einen Entrypoint haben, der nach Erfolg oder Misserfolg beendet wird, was das Debuggen erschweren kann.
Wenn Sie noch kein Entrypoint-Skript haben, erstellen Sie eines, das alle Befehle ausführt, die Sie für Ihren Container benötigen. Fügen Sie dann oben in dieser Datei die folgenden Zeilen hinzu
entrypoint.sh
:Um sicherzustellen, dass
cat
die Verbindung besteht, müssen Sie möglicherweise eine TTY bereitstellen. Ich führe den Container mit meinem Entrypoint-Skript folgendermaßen aus:Dadurch wird das Skript einmal ausgeführt und eine Datei erstellt, die angibt, dass es bereits ausgeführt wurde (im virtuellen Dateisystem des Containers). Sie können den Container dann neu starten, um das Debuggen durchzuführen:
Wenn Sie den Container neu starten, wird die
already_ran
Datei gefunden, wodurch das Entrypoint-Skript zum Stillstand kommtcat
(das nur für immer auf Eingaben wartet, die niemals kommen, aber den Container am Leben erhalten). Sie können dann eine Debugging-bash
Sitzung ausführen :Während der Container ausgeführt wird, können Sie
already_ran
dasentrypoint.sh
Skript auch entfernen und manuell ausführen, um es erneut auszuführen , wenn Sie auf diese Weise debuggen müssen.quelle
/bin/sh
anstelle von ausführen lassencat
- dann können Sie immer nur neu starten. Ihre Lösung rockt!Mein Problem:
docker run <IMAGE_NAME>
docker ps -a
ich zwei Container sehen.docker run <IMAGE_NAME>
Befehl ausführte, ein neues Image erstellt wurdeLösung: Um an demselben Container zu arbeiten, den Sie zuerst erstellt haben, führen Sie die folgenden Schritte aus
docker ps
um Container von Ihrem Container zu bekommendocker container start <CONTAINER_ID>
vorhandenen Container startendocker exec -it <CONTAINER_ID> /bin/bash
quelle
docker run <containerID>
Ich nahm die Antwort von @ Dmitriusan und machte daraus einen Alias:
Fügen Sie dies zu Ihrer
~/.bashrc
Aliase-Datei hinzu, und Sie erhalten einen raffinierten neuendocker-run-prev-container
Alias, der Sie in eine Shell im vorherigen Container einfügt.Hilfreich beim Debuggen fehlgeschlagen
docker build
s.quelle
Dies ist nicht genau das, wonach Sie fragen, aber Sie können es
docker export
für einen gestoppten Container verwenden, wenn Sie nur die Dateien überprüfen möchten.quelle
Es wurde nicht angegeben, ob der Container beendet wird, nur dass Ihr Code abstürzt und Sie sehen müssen, was im Container vor sich geht. Wenn es nicht beendet wird, finden Sie hier eine weitere mögliche Lösung.
Holen Sie sich die Container-ID mit
docker ps
docker exec -it 665b4a1e17b6 /bin/sh
Wenn der Einstiegspunkt auf etwas Problematisches eingestellt ist, kann er auch überschrieben werden, wie in Dmitriusans Antwort vorgeschlagen. Es sollte auch beachtet werden, dass Sie an jeden laufenden Container mit anhängen können
docker attach
. So viele Lösungen verschiedene Lösungen. Ich sehe einfach keine Notwendigkeit, mich auf das Bild festzulegen. Es scheint unnötig.Dokumente für Docker exec - https://docs.docker.com/engine/reference/commandline/exec/
Dokumente für Docker anhängen - https://docs.docker.com/engine/reference/commandline/attach/
quelle
Ich bin mit diesen beiden Antworten eigentlich nicht einverstanden. Wenn Sie nur sehen möchten, was sich im Container befindet, können Sie diesen Befehl ausführen, um eine Shell zu erhalten. Es ist nicht erforderlich, den Einstiegspunkt oder irgendwelche Konfigurationen zu ändern.
quelle
docker logs <container_id> --follow
das, was Sie benötigen. Eine andere Alternative besteht darin, den obigen Befehl zu verwenden und dann den Absturzdienst für dieses Image mit demselben Befehl in der Docker-Datei zu starten und von dort aus zu debuggen.quelle