Te recomendamos que revises esta resolución en un ambiente controlado antes de pasarlo a producción, saludos.
Solución:
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 manera 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). Tu puedes correr /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
Utilizar 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 de forma predeterminada).
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 hacer:
ls -lsa
o cualquier otro comando bash como:
cd ..
los -it
significa interactivo… y tty.
Este comando debería permitirle inspeccionar una imagen o un contenedor docker en ejecución:
docker inspect name-of-container-or-image
Es posible que desee hacer esto y averiguar si hay alguna bash
o sh
ahí. Busque el punto de entrada o cmd en el retorno json.
NOTA: Esta respuesta depende de que la herramienta de comentarios esté presente, pero si no hay bash
shell o herramientas comunes como ls
presente, primero puede agregar uno en una capa si tiene acceso a la Dockerfile
: ejemplo para alpino:
RUN apk add --no-cache bash
De lo contrario, si no tiene acceso a la Dockerfile
luego simplemente copie los archivos de un contenedor recién creado y mírelos haciendo:
docker create # returns container ID the container is never started.
docker cp :
docker rm
cd && ls -lsah
ver la documentación de docker exec
consulte la documentación ejecutiva de docker-compose
ver docker inspeccionar la documentación
ver docker crear documentación
En caso de que su contenedor se detenga o no tenga un caparazón (por ejemplo, hello-world
mencionado en la guía de instalación, o noalpine
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, según la imagen, puede llevar algo de tiempo y espacio en disco.
Si piensas que ha sido útil este artículo, nos gustaría que lo compartas con más desarrolladores y nos ayudes a dar difusión a nuestro contenido.