Aquí hay un par de métodos diferentes...
A) Usar docker exec (más fácil)
Docker versión 1.3 o posterior admite el comando exec
que se comportan de forma similar a nsenter
. Este comando puede ejecutar un nuevo proceso en un contenedor que ya se está ejecutando (el contenedor debe tener el proceso PID 1 en ejecución). Puedes ejecutar /bin/bash
para explorar el estado del contenedor:
docker exec -t -i mycontainer /bin/bash
consulte la documentación de la línea de comandos de Docker
B) Usar instantáneas
Puede evaluar el sistema de archivos del contenedor de esta manera:
# 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
De esta manera, puede evaluar el sistema de archivos del contenedor en ejecución en el momento preciso. El contenedor aún se está ejecutando, no se incluyen cambios futuros.
Más tarde puede eliminar la instantánea usando (¡el sistema de archivos del contenedor en ejecución no se ve afectado!):
docker rmi mysnapshot
C) Usar ssh
Si necesita acceso continuo, puede instalar sshd en su contenedor y ejecutar el demonio sshd:
docker run -d -p 22 mysnapshot /usr/sbin/sshd -D
# you need to find out which port to connect:
docker ps
De esta manera, puede ejecutar su aplicación usando ssh (conéctese y ejecute lo que quiera).
D) Usar nsenter
Usa nsenter
, consulte Por qué no necesita ejecutar SSHd en sus contenedores de Docker
La versión corta es:con nsenter, puede obtener un shell en un contenedor existente, incluso si ese contenedor no ejecuta SSH ni ningún tipo de demonio de propósito especial
ACTUALIZACIÓN:EXPLORANDO!
Este comando debería permitirle explorar un contenedor docker en ejecución :
docker exec -it name-of-container bash
El equivalente para esto en docker-compose sería:
docker-compose exec web bash
(web es el nombre del servicio en este caso y tiene tty por defecto).
Una vez que estés dentro haz:
ls -lsa
o cualquier otro comando bash como:
cd ..
Este comando debería permitirle explorar una imagen acoplable :
docker run --rm -it --entrypoint=/bin/bash name-of-image
una vez dentro haz:
ls -lsa
o cualquier otro comando bash como:
cd ..
El -it
significa interactivo... y tty.
Este comando debería permitirle inspeccionar una imagen o un contenedor acoplable en ejecución :
docker inspect name-of-container-or-image
Es posible que desee hacer esto y averiguar si hay algún bash
o sh
ahí. Busque el punto de entrada o cmd en el retorno json.
bash
shell o herramientas comunes como ls
presente, primero podría agregar uno en una capa si tiene acceso al Dockerfile
:ejemplo para alpino:
RUN apk add --no-cache bash
De lo contrario, si no tiene acceso al Dockerfile
luego simplemente copie los archivos de un contenedor recién creado y mírelos haciendo:
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
consulte la documentación de docker exec
ver docker-compose exec documentación
ver docker inspeccionar la documentación
ver docker crear documentación
En caso de que su contenedor se detenga o no tenga un shell (por ejemplo, hello-world
mencionado en la guía de instalación, o no alpine
traefik
), este es probablemente el único método posible para explorar el sistema de archivos.
Puede archivar el sistema de archivos de su contenedor en un archivo tar:
docker export adoring_kowalevski > contents.tar
O enumere los archivos:
docker export adoring_kowalevski | tar t
Tenga en cuenta que, dependiendo de la imagen, puede llevar algo de tiempo y espacio en disco.