Frage Stellen Sie den Inhalt des Docker-Containers im Host-Dateisystem bereit


Ich möchte in der Lage sein, den Inhalt eines Docker-Containers (schreibgeschützt) zu überprüfen. Ein eleganter Weg dies zu tun wäre, den Inhalt des Containers in einem Verzeichnis zu mounten. Ich spreche über das Bereitstellen des Inhalts eines Containers auf dem Host, nicht über das Bereitstellen eines Ordners auf dem Host in einem Container.

Ich kann sehen, dass es momentan zwei Speichertreiber in Docker gibt: aufs und btrfs. Meine eigene Docker-Installation verwendet btrfs und das Durchsuchen nach / var / lib / docker / btrfs / subvolumes zeigt mir ein Verzeichnis pro Docker-Container auf dem System. Dies ist jedoch ein Implementierungsdetail von Docker und es fühlt sich falsch an, --bind diese Verzeichnisse woanders einzubinden.

Gibt es einen geeigneten Weg dies zu tun, oder muss ich Docker patchen, um diese Art von Mounts zu unterstützen?


19
2017-08-18 16:08


Ursprung


Warum sollte es nicht falsch sein, diese irgendwo anders zu befestigen? - Michael Hampton♦
Da der Speicherort ein Implementierungsdetail ist. Wenn das Tag-Andockfenster einen weiteren Speichertreiber hinzufügt, wird der Speicherort verschoben. Ich muss dies halbautomatisch machen und es wäre nett, öffentliche APIs aus diesem Grund zu verwenden. - dflemstr
Es könnte eine Überlegung wert sein, über NSenter (oder docker-enter) zu arbeiten, um Ihre Ziele zu erreichen. Es gibt natürlich die Einschränkung, dass der Inspektionscode / die Werkzeuge innerhalb des Containers überprüft werden müssen. - VladFr
Gibt es keine Möglichkeit, Linux anzuweisen, über eine Containergrenze zu mounten? - dflemstr
@dflemstr Ja, da ist, --volumes-from irgendwie tut dies, es scheint eine Union des Verzeichnisses aus dem Basis-Image des anderen Containers und dem Volume zu mounten, aber dieses Verhalten ist nicht dokumentiert afaik - Tarnay Kálmán


Antworten:


Sieh dir das an docker export.

Um die Dateien in Ihrem Container schnell aufzulisten:

docker export CONTAINER|tar -t

Exportieren:

docker export CONTAINER>snapshot.tar
docker export CONTAINER|tar x PATH-IN-CONTAINER

Oder um eine Datei anzuschauen:

docker export CONTAINER|tar x --to-stdout PATH-IN-CONTAINER
# e.g. 
docker export consul|tar x --to-stdout etc/profile

Docker 1.8 unterstützt CP:

https://docs.docker.com/reference/commandline/cp/

Usage:  docker cp [options] CONTAINER:PATH LOCALPATH|-
        docker cp [options] LOCALPATH|- CONTAINER:PATH

update: Sie sollten ssh an Ihren Docker-Rechner senden, wenn Sie dies ausführen.


8
2017-07-29 14:03



Meine Bilder sind ziemlich groß (viele hundert MiB), so dass das Abrufen einzelner Dateien zu viel Aufwand bedeutet. Es wird jedes Mal die Multi-Hundert-Megabyte-Datei erstellen. - dflemstr
@dflemstr benutze die Zeile mit tar x PATH-IN-CONTAINEREs extrahiert nur die Dateien, die Sie benötigen. - laktak
... aber das Ganze tar Archiv wird immer noch im Docker-Daemon erstellt, und es dauert mehrere Minuten, um ... - dflemstr
@dflemstr nicht sicher, was Ihr Setup ist, aber z.B. docker export ubuntu|tar -t|grep etc/network dauert 3 Sekunden für mich. - laktak
Sie führen das wahrscheinlich auf demselben Computer wie der Docker-Daemon aus, so dass Sie keine Netzwerkübertragung durchführen müssen ubuntu Das Bild ist wirklich klein ... - dflemstr


Sie können verwenden docker commit um den aktuellen Zustand Ihres Containers in einem neuen Bild zu erhalten und einen interaktiven Container von diesem Bild aus zu starten, um den Inhalt zu überprüfen.

Aus der Dokumentation:

Es kann nützlich sein, Änderungen oder Einstellungen eines Containers in Dateien zu übernehmen   ein neues Bild. Dadurch können Sie einen Container debuggen, indem Sie einen ausführen   interaktive Shell, oder um ein funktionierendes Dataset auf einen anderen Server zu exportieren.

Hoffe das hilft.


3
2017-07-06 14:50





Sie können NSenter verwenden, um Ihr Prüfprogramm (das wahrscheinlich bereits im Container enthalten sein muss) in einem Container / Namespace auszuführen. Um jedoch das Container-Dateisystem zu mounten, wie es darin zu sehen ist, müssen Sie das Original-Image und alle Layer mounten, wenn es aufs ist, oder die entsprechende Aktion für Device-Mapper, btrfs und die anderen (zukünftigen) Storage-Engines, jeweils unterschiedlich. Wahrscheinlich wäre es effizienter, docker die Arbeit für Sie erledigen zu lassen, genau wie es sich gehört, und nsenter zu benutzen, um die Inspektion im Container durchzuführen.

Es gibt andere Ansätze. docker diff zeigt an, welche Dateien in diesem Container geändert wurden, wenn Sie sehen möchten, was sich geändert hat, anstatt im Originalbild.

Und für Daten, die persistent und inspizierbar sein müssen, wäre es wahrscheinlich ein besseres Muster, sie in einem Volumen im Container zu haben, und sie entweder auf dem realen Dateisystem oder in einem reinen Datencontainer oder in demselben Container, aber dass Sie einen anderen Container starten können, indem das Inspektionsprogramm diese Volumes von ihm einbindet.


2
2017-10-14 11:22





EDIT: Ich habe die Lösung unten versucht und leider hat es in der Praxis nicht gut funktioniert. Das angehängte Dateisystem hat das Dateisystem des Containers nicht korrekt wiedergegeben (auch nicht mit cache=no). Ich bin mir nicht sicher, ob das ein grundlegendes Problem ist oder ich etwas falsch mache.

Sie können sshd im Docker-Image installieren und verwenden docker exec einen ssh-Dienst ausführen (/usr/sbin/sshd -D) auf dem Andock-Container (beachten Sie, dass der SSH-Port 22 des Andock-Containers freigelegt werden muss).

Dann benutze docker cp kopieren Sie Ihren öffentlichen SSH - Schlüssel in die /root/.ssh/authorized_keys Verzeichnis des Andock-Containers.

Schließlich, verwenden Sie docker inspect um die IP-Adresse des Containers zu finden und das Dateisystem des Containers mit zu mounten

sudo sshfs -o allow_other,default_permissions,IdentityFile=/path/to/identityfile  root@xxx.xx.x.x:/ /mnt/my_container

Sie müssten ein Skript schreiben, um das in der Praxis bequem zu machen.


1
2018-05-12 11:47