linux Esplorazione del file system del contenitore Docker




10 Answers

AGGIORNAMENTO: ESPLORAZIONE!

Questo comando dovrebbe consentire di esplorare un container mobile in esecuzione :

docker exec -it name-of-container bash

una volta dentro fai:

ls -lsa

o qualsiasi altro comando bash come:

cd ..

Questo comando dovrebbe consentire di esplorare un'immagine di finestra mobile :

docker run --rm -it --entrypoint=/bin/bash name-of-image

una volta dentro fai:

ls -lsa

o qualsiasi altro comando bash come:

cd ..

The -it sta per interactive ... and tty

linux docker filesystems

Ho notato con la finestra mobile che ho bisogno di capire cosa sta succedendo all'interno di un contenitore o quali file esistono in là. Un esempio è il download delle immagini dall'indice di docker: non hai idea di cosa contiene l'immagine, quindi è impossibile avviare l'applicazione.

Quale sarebbe l'ideale è essere in grado di ssh in loro o equivalente. C'è uno strumento per farlo, o la mia concettualizzazione della finestra mobile è sbagliata nel pensare che dovrei essere in grado di farlo.




Il file system del contenitore si trova nella cartella dati della finestra mobile, normalmente in / var / lib / docker. Per avviare e ispezionare un file system di contenitori in esecuzione, effettuare le seguenti operazioni:

hash=$(docker run busybox)
cd /var/lib/docker/aufs/mnt/$hash

E ora la directory di lavoro corrente è la radice del contenitore.




Prima della creazione del contenitore:

Se si esplora la struttura dell'immagine montata all'interno del contenitore, è possibile farlo

sudo docker image save image_name > image.tar
tar -xvf image.tar

Questo ti darebbe la visibilità di tutti i livelli di un'immagine e della sua configurazione che è presente nei file json.

Dopo la creazione del contenitore:

Per questo ci sono già molte risposte sopra. il mio modo preferito per farlo sarebbe -

docker exec -t -i container /bin/bash



La risposta più aggiornata funziona per me quando il contenitore è effettivamente avviato, ma quando non è possibile eseguirlo e ad esempio vuoi copiare i file dal contenitore, questo mi ha salvato prima:

docker cp <container-name>:<path/inside/container> <path/on/host/>

Grazie a docker cp ( this ) puoi copiare direttamente dal container come se fosse una qualsiasi altra parte del tuo filesystem. Ad esempio, il recupero di tutti i file all'interno di un contenitore:

mkdir /tmp/container_temp
docker cp example_container:/ /tmp/container_temp/

Si noti che non è necessario specificare che si desidera copiare ricorsivamente.




La risposta più votata è buona, tranne se il tuo contenitore non è un vero sistema Linux.

Molti contenitori (specialmente quelli basati su go) non hanno alcun binario standard (no /bin/bash o /bin/sh ). In tal caso, sarà necessario accedere direttamente al file dei contenitori effettivi:

Funziona come un fascino:

name=<name>
dockerId=$(docker inspect -f {{.Id}} $name)
mountId=$(cat /var/lib/docker/image/aufs/layerdb/mounts/$dockerId/mount-id)
cd /var/lib/docker/aufs/mnt/$mountId

Nota: è necessario eseguirlo come root.




Per il driver di docker aufs:

Lo script troverà la directory principale del contenitore (Test su docker 1.7.1 e 1.10.3)

if [ -z "$1" ] ; then
 echo 'docker-find-root $container_id_or_name '
 exit 1
fi
CID=$(docker inspect   --format {{.Id}} $1)
if [ -n "$CID" ] ; then
    if [ -f  /var/lib/docker/image/aufs/layerdb/mounts/$CID/mount-id ] ; then
        F1=$(cat /var/lib/docker/image/aufs/layerdb/mounts/$CID/mount-id)
       d1=/var/lib/docker/aufs/mnt/$F1
    fi
    if [ ! -d "$d1" ] ; then
        d1=/var/lib/docker/aufs/diff/$CID
    fi
    echo $d1
fi



Nelle versioni più recenti di Docker è possibile eseguire docker exec [container_name] che esegue una shell all'interno del contenitore

Quindi per ottenere un elenco di tutti i file in un contenitore è sufficiente eseguire docker exec [container_name] ls




un altro trucco è usare lo strumento atomic per fare qualcosa del tipo:

mkdir -p /path/to/mnt && atomic mount IMAGE /path/to/mnt

L'immagine Docker verrà montata su / percorso / su / mnt per consentirne l'ispezione.




Questa risposta aiuterà coloro (come me) che desiderano esplorare il filesystem del volume della finestra mobile anche se il contenitore non è in esecuzione.

Elenca contenitori di finestra mobile in esecuzione:

docker ps

=> ID CONTENITORE "4c721f1985bd"

Guarda i punti di montaggio del volume della finestra mobile sulla tua macchina fisica locale ( https://docs.docker.com/engine/tutorials/dockervolumes/ ):

docker inspect -f {{.Mounts}} 4c721f1985bd

=> [{/ tmp / container-garren / tmp true rprivate}]

Questo mi dice che la directory della macchina fisica locale / tmp / container-garren è mappata alla destinazione del volume docker / tmp.

Conoscere la directory della macchina fisica locale (/ tmp / container-garren) significa che posso esplorare il filesystem indipendentemente dal fatto che il container sia in esecuzione o meno. Questo è stato fondamentale per aiutarmi a capire che c'erano alcuni dati residui che non avrebbero dovuto persistere anche dopo che il container non era in esecuzione.




Il comando docker exec per eseguire un comando in un contenitore in esecuzione può aiutare in più casi.


Usage:  docker exec [OPTIONS] CONTAINER COMMAND [ARG...]

Run a command in a running container

Options:
  -d, --detach               Detached mode: run command in the background
      --detach-keys string   Override the key sequence for detaching a
                             container
  -e, --env list             Set environment variables
  -i, --interactive          Keep STDIN open even if not attached
      --privileged           Give extended privileges to the command
  -t, --tty                  Allocate a pseudo-TTY
  -u, --user string          Username or UID (format:
                             [:])
  -w, --workdir string       Working directory inside the container

Per esempio :

1) Accesso in bash al filesystem del contenitore in esecuzione:

docker exec -it containerId bash 

2) Accesso in bash al filesystem del contenitore in esecuzione come root per poter disporre dei diritti richiesti:

docker exec -it -u root containerId bash  

Ciò è particolarmente utile per poter eseguire alcune elaborazioni come root in un contenitore.

3) Accesso in bash al filesystem del contenitore in esecuzione con una directory di lavoro specifica:

docker exec -it -w /var/lib containerId bash 





Related