Beim Versuch, Fehler zu beheben und Probleme mit meiner Anwendung zu debuggen, die auf mehrere Container aufgeteilt ist, bearbeite ich häufig Dateien in Containern:
entweder bin ich total faul und installiere nano und bearbeite direkt im container oder
Ich docke die Datei aus dem Container, bearbeite sie, kopiere sie zurück und starte den Container neu
Dies sind Zwischenschritte, bevor neue Inhalte für die Containererstellung erstellt werden. Dies dauert viel länger als die oben genannten Schritte (was natürlich nur Zwischenschritte sind).
Jetzt breche ich häufig das Startprogramm des Containers, das in den fehlerhaften Fällen entweder ein Knotenskript oder ein Python-Webserver-Skript ist. Beide schlagen normalerweise aufgrund von Syntaxfehlern fehl.
Gibt es eine Möglichkeit, diese Container zu speichern? Da sie nicht starten, kann ich sie nicht andocken, und daher sind sie für mich verloren. Ich gehe dann die Route rm / rmi / build / run, nachdem ich die fehlerhafte Datei in der Build-Eingabe korrigiert habe.
Wie kann ich entweder Dateien in einem gestoppten Container bearbeiten oder sie kopieren oder eine Shell in einem gestoppten Container starten - alles, was mir erlaubt, diesen Container zu reparieren?
(Es scheint ein bisschen so, als würde man an einem Remotecomputer arbeiten und die Netzwerkkonfiguration unterbrechen. Auf diese Weise wird die Verbindung "für immer" unterbrochen, und man muss einen Fallback verwenden, falls vorhanden.)
Wie bearbeite ich Docker-Container-Dateien vom Host aus? sieht relevant aus, ist aber veraltet.
docker cp
die Dateien im Containerdocker commit
Befehl verwenden, um ein neues Bild zu brechen.name=$(docker commit); docker run -it $name /bin/sh
wird tun was du willst.Antworten:
Ich hatte ein Problem mit einem Container, der aufgrund einer fehlerhaften Konfigurationsänderung nicht gestartet werden konnte. Ich konnte die Datei aus dem gestoppten Container kopieren und bearbeiten. etwas wie:
(korrigiere die Datei)
quelle
UpperDir
Sie erhalten, müssendocker container inspect
Sie experimentieren, um zu sehen, wie das Overlay-System Dateien in der zugrunde liegenden Struktur darstellt, die in der oberen Ebene gelöscht wurden.Beantwortung meiner eigenen Frage .. Ich hoffe immer noch auf eine bessere Antwort von einer sachkundigeren Person !!
Es gibt 2 Möglichkeiten.
1) Bearbeiten des Dateisystems auf dem Host direkt . Dies ist etwas gefährlich und kann den Container vollständig beschädigen, möglicherweise andere Daten, je nachdem, was schief geht.
2) Ändern Sie das Startskript in etwas, das niemals fehlschlägt, z. B. das Starten einer Bash, das Durchführen der Korrekturen / Änderungen und das erneute Ändern des Startprogramms auf das gewünschte (z. B. Knoten oder was auch immer zuvor).
Mehr Details:
1) Verwenden
um die laufenden Container zu finden oder
um alle Container (einschließlich angehaltener) zu finden und
Suchen Sie nach der "Id", einem der ersten Werte.
Dies ist der Teil, der Implementierungsdetails enthält und sich möglicherweise ändert. Beachten Sie, dass Sie Ihren Container auf diese Weise verlieren können.
Gehe zu
und dort finden Sie alle Dateien, die in Richtung des Bildes geändert wurden, auf dem der Container basiert. Sie können Dateien überschreiben, Dateien hinzufügen oder bearbeiten.
Auch dies würde ich nicht empfehlen.
2) Wie unter https://stackoverflow.com/a/32353134/586754 beschrieben , finden Sie die Konfiguration json config.json unter einem Pfad wie
Dort können Sie die Argumente von zB "nodejs app.js" in "/ bin / bash" ändern. Starten Sie nun den Docker-Dienst neu und starten Sie den Container (Sie sollten sehen, dass er jetzt korrekt gestartet wird). Du solltest benutzen
um sicherzustellen, dass es nicht sofort beendet wird. Sie können jetzt mit dem Container arbeiten und / oder später mit anhängen
Docker cp ist auch sehr nützlich zum Kopieren von Dateien, die außerhalb des Containers bearbeitet wurden.
Außerdem sollte man nur dann auf diese Maßnahmen zurückgreifen, wenn der Container ohnehin mehr oder weniger "verloren" ist, so dass jede Änderung eine Verbesserung wäre.
quelle
config.json
Dateien jedes Mal zu erzwingen, wenn ich sie bearbeiteteSie können das Container-Dateisystem direkt bearbeiten, aber ich weiß nicht, ob es eine gute Idee ist. Zuerst müssen Sie den Pfad des Verzeichnisses finden, das als Laufzeitstamm für den Container verwendet wird. Ausführen
docker container inspect id/name
. Suchen Sie nach dem SchlüsselUpperDir
in der JSON-Ausgabe .Das ist dein Verzeichnis.
quelle
Wenn Sie versuchen, einen gestoppten Container neu zu starten und den Container aufgrund einer Fehlkonfiguration ändern müssen, der Container jedoch nicht gestartet wird, können Sie die folgenden Schritte mit dem Befehl "docker cp" ausführen (ähnlich dem vorherigen Vorschlag). Mit diesem Verfahren können Sie Dateien entfernen und andere erforderliche Änderungen vornehmen. Mit etwas Glück können Sie viele der folgenden Schritte überspringen.
Ändern oder erstellen Sie beispielsweise ein neues Einstiegspunktskript
#!/bin/bash tail -f /etc/hosts
quelle