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?
quelle
Antworten:
Schauen Sie sich an
docker export
.So listen Sie die Dateien in Ihrem Container schnell auf:
Exportieren:
Oder um eine Datei anzusehen:
Docker 1.8 unterstützt cp :
https://docs.docker.com/reference/commandline/cp/
Update: Sie sollten ssh auf Ihrem Docker-Computer ausführen, wenn Sie dies ausführen.
quelle
tar x PATH-IN-CONTAINER
, es werden nur die benötigten Dateien extrahiert.tar
Archiv wird immer noch im Docker-Daemon erstellt und es dauert mehrere Minuten, bis ...docker export ubuntu|tar -t|grep etc/network
dauert es 3 sekunden für mich.ubuntu
Image ist wirklich klein ...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:
Hoffe das hilft.
quelle
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.
quelle
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 exec
einen 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 cp
Ihren öffentlichen SSH - Schlüssel zum kopieren/root/.ssh/authorized_keys
Verzeichnis der Docker - Container.Schließlich verwenden
docker inspect
die Container IP - Adresse zu finden , und der Behälter Dateisystem mounten mitSie müssten ein Skript schreiben, damit dies in der Praxis problemlos funktioniert.
quelle