Mounten Sie den Inhalt des Docker-Containers im Host-Dateisystem

24

Ich möchte den Inhalt eines Docker-Containers überprüfen können (schreibgeschützt). Ein eleganter Weg, dies zu tun, wäre, den Inhalt des Containers in ein Verzeichnis einzuhängen. Ich spreche über das Mounten des Inhalts eines Containers auf dem Host, nicht über das Mounten eines Ordners auf dem Host in einem Container.

Ich kann sehen, dass es im Docker momentan zwei Speichertreiber gibt: aufs und btrfs. Meine eigene Docker-Installation verwendet btrfs, und das Navigieren zu / 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, diese Verzeichnisse an einer anderen Stelle einzuhängen.

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

dflemstr
quelle
Warum wäre es falsch, diese irgendwo anders zu binden?
Michael Hampton
1
Weil der Speicherort ein Implementierungsdetail ist. Der Day Docker fügt einen weiteren Speichertreiber hinzu, der Standort wird verschoben. Ich muss das halbautomatisch machen und es wäre schön, aus diesem Grund öffentliche APIs zu verwenden.
Dflemstr
2
Es könnte sich lohnen, über nsenter (oder docker-enter) nachzudenken, um Ihre Ziele zu erreichen. Es besteht natürlich die Einschränkung, dass der Inspektionscode / die Inspektionswerkzeuge im Container eingegeben werden müssen.
VladFr
Gibt es keine Möglichkeit, Linux anzuweisen, über eine Containergrenze hinweg zu mounten?
Dflemstr
@dflemstr ja, es gibt --volumes-from tut das irgendwie, es scheint eine Vereinigung des Verzeichnisses aus dem Basisimage des anderen Containers und dem Volume zu mounten, aber dieses Verhalten ist afaik nicht dokumentiert
Tarnay Kálmán 29.09.14

Antworten:

10

Schauen Sie sich an docker export.

So listen Sie die Dateien in Ihrem Container schnell auf:

docker export CONTAINER|tar -t

Exportieren:

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

Oder um eine Datei anzusehen:

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 auf Ihrem Docker-Computer ausführen, wenn Sie dies ausführen.

laktak
quelle
2
Meine Bilder sind ziemlich groß (viele hundert MiB), daher ist das Abrufen einzelner Dateien zu aufwändig. Dabei wird jedes Mal eine Datei mit mehreren Hundert Megabyte erstellt.
Dflemstr
@dflemstr benutze die Zeile mit tar x PATH-IN-CONTAINER, es werden nur die benötigten Dateien extrahiert.
Laktak
... aber das gesamte tarArchiv wird immer noch im Docker-Daemon erstellt und es dauert mehrere Minuten, bis ...
dflemstr
@dflemstr bin mir nicht sicher was dein setup ist aber zB docker export ubuntu|tar -t|grep etc/networkdauert es 3 sekunden für mich.
Laktak
Wahrscheinlich läuft das auf demselben Computer wie der Docker-Daemon, sodass Sie keine Netzwerkübertragung durchführen müssen, und das ubuntuImage ist wirklich klein ...
dflemstr
3

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

Aus der Dokumentation:

Es kann nützlich sein, die Dateiänderungen oder -einstellungen eines Containers in ein neues Image zu übernehmen. Auf diese Weise können Sie einen Container debuggen, indem Sie eine interaktive Shell ausführen oder ein funktionierendes Dataset auf einen anderen Server exportieren.

Hoffe das hilft.

Eric Citaire
quelle
2

Sie können nsenter verwenden, um Ihr Inspektionsprogramm (das wahrscheinlich bereits im Container enthalten sein muss) in einem Container / Namespace auszuführen. Aber um das Container-Dateisystem so zu mounten, wie es darin zu sehen ist, müssen Sie das Original-Image und alle Ebenen, wenn es aufsetzt, oder die entsprechende Aktion für Device Mapper, BTRFS und die anderen (zukünftigen) Speicher-Engines, die jeweils verwendet werden, mounten. Wahrscheinlich wäre es effizienter, wenn Docker die Arbeit genau so für Sie erledigen würde, wie es beabsichtigt ist, und nsenter für die Inspektion im Inneren des Containers verwenden würde.

Es gibt andere Ansätze. Docker Diff zeigt an, welche Dateien in diesem Container geändert wurden, wenn Sie sehen möchten, welche Änderungen statt der Änderungen im Originalbild vorgenommen wurden.

Und für Daten, die persistent und überprüfbar sein müssen, wäre es wahrscheinlich ein besseres Muster, sie in einem Volume im Container zu haben und sie entweder auf dem realen Dateisystem oder in einem reinen Datencontainer oder im selben Container zu mounten, aber dass Sie einen anderen Container mit dem Inspektionsprogramm starten können, das diese Volumes von ihm aus bereitstellt.

gmuslera
quelle
1

EDIT: Ich habe die folgende Lösung ausprobiert und leider hat es in der Praxis nicht gut funktioniert. Das gemountete Dateisystem spiegelte das Dateisystem des Containers nicht genau wider (auch nicht mit cache=no). Ich bin mir nicht sicher, ob dies ein grundlegendes Problem ist oder ob ich etwas falsch mache.

Sie können sshd im Docker-Image installieren und docker execeinen ssh-Dienst ( /usr/sbin/sshd -D) für den Docker-Container ausführen (beachten Sie, dass der SSH-Port 22 des Docker-Containers verfügbar sein muss).

Verwenden Sie dann docker cpIhren öffentlichen SSH - Schlüssel zum kopieren /root/.ssh/authorized_keysVerzeichnis der Docker - Container.

Schließlich verwenden docker inspectdie Container IP - Adresse zu finden , und der Behälter Dateisystem mounten mit

sudo sshfs -o allow_other,default_permissions,IdentityFile=/path/to/identityfile  [email protected]:/ /mnt/my_container

Sie müssten ein Skript schreiben, damit dies in der Praxis problemlos funktioniert.

mnieber
quelle