Explorer ses volumes docker unbound en 1 function

L’instruction VOLUME du Dockerfile permet de monter un dossier du conteneur dans son hôte.
Sur mon environnement, ils sont montés par défaut dans /var/lib/docker/volumes/, si je ne fournis pas de paramètre de binding dans la commande run.

Exemple

Le Dockerfile suivant construit une image helloworld. C’est probablement le tout premier dockerfile que vous aviez construit en suivant la doc officielle.

FROM ubuntu
RUN mkdir /myvol
RUN echo "hello world" > /myvol/greeting
VOLUME /myvol

Je le construis :

docker build -t hello-world .

Je le run sans aucun binding :

docker run --rm -it hello-world

(Grâce au paramètre --rm, le volume sera supprimé dès l’arrêt du conteneur).
Dans le conteneur, je regarde le contenu de /myvol :

ls /myvol
greeting

Je me détache du conteneur sans le quitter : ctrl + p + q.
Et là, depuis l’hôte, j’aimerais aller explorer le volume.

Docker volume

docker volume ls
DRIVER              VOLUME NAME
local               574b5d1846a2608a682ba4d6d7405c7c05870c2a858d0d16c0be40fe55035766
local               f235c4a14e4e66fbdd6664d373864608b77be0bf706e23b1c3d924ea469190bf
local               server

Et là, misère, lequel est mon volume ??
Ils sont bien triés par ordre de dernière utilisation, mais vous imaginez que la situation pourrait être bien pire…
S’ensuit alors une série de docker volume inspect et de copié-collés, jusqu’à trouver celui qui nous intéresse.

Une pitite function

Je me suis alors créé la function dkvls (DocKerVolumeLS) dans mon .bashrc.
Elle dépend de jq.

function dkvls() {
    if [ -z "$1" ]; then
        docker volume ls
        return 0
    fi
    if [ "$1" == "all" ]; then
        docker volume ls | awk '{print $2}' | grep -v VOLUME | xargs docker volume inspect | jq '.[].Mountpoint' | xargs sudo ls
        return 0
    fi
    inspected="$(dkvls | awk '{print $2}' | grep "^$1" | head -n1)"
    if [ -z "$inspected" ]; then
        return 0
    fi
    docker volume inspect "$inspected" | jq '.[0].Mountpoint' | xargs sudo ls
}

Usage

dkvls #Revient à faire docker volume ls
dkvls all #Fait un ls dans chaque volume
dkvls <volume_id> # Fait un ls dans le volume dont l'id commence par volume_id