Ecco un paio di metodi diversi...
A) Usa docker exec (più semplice)
Docker versione 1.3 o successiva supporta il comando exec
che si comportano in modo simile a nsenter
. Questo comando può eseguire un nuovo processo in un contenitore già in esecuzione (il contenitore deve avere già un processo PID 1 in esecuzione). Puoi eseguire /bin/bash
per esplorare lo stato del contenitore:
docker exec -t -i mycontainer /bin/bash
consulta la documentazione della riga di comando di Docker
B) Usa l'istantanea
Puoi valutare il filesystem contenitore in questo modo:
# find ID of your running container:
docker ps
# create image (snapshot) from container filesystem
docker commit 12345678904b5 mysnapshot
# explore this filesystem using bash (for example)
docker run -t -i mysnapshot /bin/bash
In questo modo, puoi valutare il filesystem del contenitore in esecuzione nel momento preciso. Il contenitore è ancora in esecuzione, non sono incluse modifiche future.
Successivamente puoi eliminare l'istantanea usando (il filesystem del contenitore in esecuzione non è interessato!):
docker rmi mysnapshot
C) Usa ssh
Se hai bisogno di un accesso continuo, puoi installare sshd nel tuo container ed eseguire il demone sshd:
docker run -d -p 22 mysnapshot /usr/sbin/sshd -D
# you need to find out which port to connect:
docker ps
In questo modo, puoi eseguire la tua app usando ssh (connettiti ed esegui quello che vuoi).
D) Usa nsenter
Usa nsenter
, vedi Perché non è necessario eseguire SSHd nei container Docker
La versione breve è:con nsenter, puoi inserire una shell in un contenitore esistente, anche se quel contenitore non esegue SSH o qualsiasi tipo di demone per scopi speciali
AGGIORNAMENTO:ESPLORAZIONE!
Questo comando dovrebbe consentirti di esplorare un contenitore docker in esecuzione :
docker exec -it name-of-container bash
L'equivalente per questo in docker-compose sarebbe:
docker-compose exec web bash
(web è il nome del servizio in questo caso e ha tty per impostazione predefinita.)
Una volta che sei dentro fai:
ls -lsa
o qualsiasi altro comando bash come:
cd ..
Questo comando dovrebbe consentirti di esplorare un'immagine docker :
docker run --rm -it --entrypoint=/bin/bash name-of-image
una volta dentro fai:
ls -lsa
o qualsiasi altro comando bash come:
cd ..
Il -it
sta per interattivo... e tty.
Questo comando dovrebbe consentirti di ispezionare un contenitore o un'immagine docker in esecuzione :
docker inspect name-of-container-or-image
Potresti volerlo fare e scoprire se c'è qualche bash
o sh
lì dentro. Cerca entrypoint o cmd nel json return.
NOTA: Questa risposta si basa sulla presenza dello strumento commen, ma se non c'è bash
shell o strumenti comuni come ls
present potresti prima aggiungerne uno in un livello se hai accesso a Dockerfile
:esempio per alpine:
RUN apk add --no-cache bash
Altrimenti se non hai accesso al Dockerfile
quindi basta copiare i file da un contenitore appena creato e cercarli facendo:
docker create <image> # returns container ID the container is never started.
docker cp <container ID>:<source_path> <destination_path>
docker rm <container ID>
cd <destination_path> && ls -lsah
vedere la documentazione di docker exec
vedere la documentazione di docker-compose exec
vedere la documentazione di docker inspect
vedere docker create documentazione
Nel caso in cui il tuo contenitore sia fermo o non abbia una shell (ad es. hello-world
menzionato nella guida all'installazione, o diverso da alpine
traefik
), questo è probabilmente l'unico metodo possibile per esplorare il filesystem.
Puoi archiviare il filesystem del tuo contenitore nel file tar:
docker export adoring_kowalevski > contents.tar
Oppure elenca i file:
docker export adoring_kowalevski | tar t
Tieni presente che, a seconda dell'immagine, potrebbe richiedere del tempo e spazio su disco.