Wie liste ich den Inhalt eines benannten Volumes in Docker 1.9+ auf?


76

Docker 1.9 fügte benannte Volumes hinzu, also habe ich ..

docker volume create --name postgres-data

docker volume ls 

und ich verstehe

local               postgres-data

alles gut soweit ..

Wie sehe ich also, was sich in dem genannten Band befindet? Gibt es eine Möglichkeit, auf dem Host-System darauf zu cd. Wie kann ich für ein gemountetes Hostverzeichnis?

Antworten:


122
docker run --rm -i -v=postgres-data:/tmp/myvolume busybox find /tmp/myvolume

Erläuterung: Erstellen Sie einen minimalen Container mit Tools, um die Dateien des Volumes anzuzeigen (Busybox), hängen Sie das benannte Volume in das Verzeichnis eines Containers ein ( v=postgres-data:/tmp/myvolume) und listen Sie die Dateien des Volumes auf ( find /tmp/myvolume). Entfernen Sie den Behälter, wenn die Auflistung abgeschlossen ist ( --rm).


4
Es ist eine gute Antwort, aber ich mag es nicht, dass ein anderer Container erstellt werden muss, um das Dateisystem eines Containers zu betrachten. Die erste Antwort vermeidet dies.
Duane

1
Die erste Antwort hat bei mir nicht funktioniert. Verzeichnis gab es dort nicht. Diese Antwort hat funktioniert.
Rob

2
Angesichts des überwältigenden Feedbacks. Ich mache dies zur akzeptierten Antwort.
Duane

Sehen Sie sich meine Antwort unten an, um zu sehen, warum Sie unter Mac oder Windows nicht auf den Pfad zugreifen können.
Ricardo Pedroni

Nimm deine Punkte, mein Freund. Du hast mir gerade das Leben gerettet.
Miso

36

Du kannst rennen docker volume inspect postgres-data

und siehe MountpointAbschnitt des Ergebnisses

Daher zeigt der Quellparameter auf das Host-Verzeichnis, möglicherweise auf das /var/lib/docker/volumes/[volume_name]/_dataVerzeichnis


fast richtig ... ich habe es versucht, diese Antwort funktioniert für ein Datenvolumen-Container-Ding .. Ich denke, Sie könnten gemeint haben .. docker volume inspect postgres-data?
Duane

Haben Sie versucht, Ihren schriftlichen Befehl auszuführen? Ich bezweifle, dass es funktionieren wird, da Sie anstelle des Containernamens einen Volume-Hash übergeben müssen. Sie können Liste der Bände mitdocker volume ls
Vaidas Lungis

@ vaidasniedu02 @ ubuntu: ~ / Assistant $ Docker-Volume Postgres-Daten überprüfen` [{"Name": "Postgres-Daten", "Treiber": "lokal", "Mountpoint": "/ var / lib / docker / volume / postgres-data / _data "}]
Duane

1
Ja, es funktioniert für ein benanntes Volume . Dies war eine neue Funktion, die in Docker 1.9 hinzugefügt wurde. Ich denke, Ihre Antwort bezieht sich auf einen benannten Container , nicht auf ein benanntes Volume. Testen Sie es und aktualisieren Sie die Antwort, damit ich Ihre Antwort richtig markieren kann.
Duane

2
Warum ist dies die akzeptierte Antwort? Es beantwortet die Frage nicht.
Ajh158

9

Hier ist eine Idee ...

docker run -it --name admin -v postgres-data:/var/lib/postgresql/data ubuntu

dann in der interaktiven Shell

ls /var/lib/postgresql/data 

Bessere Ideen willkommen!


8

Sie können sehen, wo Docker ein Volume speichert, indem Sie es ausführen docker volume inspect <volume>.

Es gibt jedoch eine Einschränkung: Sie können den Inhalt von Volumes unter Mac und Windows nicht direkt anzeigen. Dies liegt daran, dass Docker tatsächlich eine Linux-VM ausführt, um Container zu erstellen, da Containzerzation eine native Funktionalität für Linux ist, nicht jedoch für diese anderen Betriebssysteme. Der angezeigte Pfad ist also tatsächlich der Pfad innerhalb der VM und nicht auf Ihrem Hostsystem.

Sie können auf diese Volumes zugreifen, indem Sie die in den anderen Antworten genannten Methoden verwenden (erstellen Sie einen kurzlebigen Container, um nur den Inhalt anzuzeigen), oder Sie können direkt auf diese zugreifen.

Für Mac können Sie Folgendes verwenden screen, um Zugriff auf die VM zu erhalten:

# This path can be slightly different on your system
screen ~/Library/Containers/com.docker.docker/Data/vms/0/tty

Und dort können Sie zu dem Pfad navigieren, der docker volume inspectIhnen gegeben hat.

Überprüfen Sie unter Windows die Lösung in den Kommentaren zu dieser Antwort.


2
Unter Windows 10 können Sie mit Docker Desktop und WSL2 \\wsl$\docker-desktop-data\version-pack-data\community\docker\volumesim Windows Explorer aufrufen .
Rodney Richardson

Super Kommentar oben - auf Windows Git Bash können Sie es mit ... cd // wsl $ / Docker-Desktop-Daten / Version-Pack-Daten / Community / Docker / Volumes
danday74

5

Ich benutze diese praktische Funktion, um den Inhalt meiner Volumes aufzulisten:

dvolume() {
  local volume volumes_to_list=${1:-$(docker volume ls --quiet)}
  for volume in $volumes_to_list; do
    sudo ls -lRa "$(docker volume inspect --format '{{ .Mountpoint }}' "$volume")"
    echo
  done
}

Beachten Sie, dass Sie die Funktion auf zwei Arten aufrufen können:

$ dvolume           # for each volume, list its content
$ dvolume <volume>  # list <volume>'s content

Ich würde diese Methode nicht verwenden. Ich glaube, dies kann dazu führen, dass einige der Berechtigungen für Volumendateien in einem schlechten Zustand mutiert werden. Es hat ein Volume beschädigt, an dem ich gearbeitet habe
StanleyZheng

1
Ich würde wirklich gerne mehr Details über das Problem erfahren, über das Sie sprechen. Vielen Dank.
whoan

@StanleyZheng Wie können die Dateiberechtigungen des Volumes geändert werden, wenn das bereitgestellte Shell-Skript nur Verzeichnisinhalte auflistet?
Alan Evangelista


3

Oder keine Notwendigkeit für jq oder den neuen Container .

cd in das Verzeichnis:

cd $(docker volume inspect <volume name> | grep Mountpoint | cut -d\" -f 4)

Zeigen Sie den Inhalt des Verzeichnisses an:

ls -las $(docker volume inspect <volume name> | grep Mountpoint | cut -d\" -f 4)

Noch besser! Zeigen Sie den Inhalt aller Volumes an: __

for i in  `docker volume ls -q`; do echo volume: ${i}; \
ls -las $(docker volume inspect $i | grep Mountpoint | cut -d\" -f 4); \
done

Verwenden Sie es die ganze Zeit, wenn Sie schnell etwas finden müssen.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.