Cómo inspeccionar los cambios en el sistema de archivos de un contenedor Docker


Los contenedores Docker heredan el sistema de archivos de su imagen en la creación inicial. El sistema de archivos del contenedor puede diferir del contenido de la imagen después de la creación si se realizan cambios en la capa de escritura del contenedor.

La capacidad de inspeccionar los cambios en el sistema de archivos puede ayudarlo a depurar problemas e investigar los datos faltantes. Los archivos escritos en el sistema de archivos del contenedor se perderán cuando ese contenedor se reinicie o se destruya. En algunos casos, es posible que esté realizando escrituras sin querer que deberían dirigirse a un volumen persistente.

En este artículo, compartiremos algunas técnicas para identificar las modificaciones realizadas en los sistemas de archivos del contenedor. Puede utilizar esta información para realizar un seguimiento de la actividad del contenedor e investigar discrepancias entre diferentes entornos.

Uso de diferencias de Docker

La CLI de Docker tiene un comando incorporado para este propósito. Correr docker diff enumerará todos los cambios realizados en archivos y directorios dentro de un contenedor en particular. Acepta el ID o nombre del contenedor que desea inspeccionar.

Inicie un contenedor simple para fines de demostración:

$ docker run -it --name alpine alpine:latest sh

Esto iniciará un nuevo contenedor que ejecuta la imagen de Alpine. Su ventana de terminal se adjuntará al contenedor. Mantenga esta ventana abierta.

ahora corre docker diff en una segunda sesión de terminal:

$ docker diff alpine

No se produce ningún resultado ya que el contenedor nuevo aún coincide exactamente con el sistema de archivos de la imagen de Alpine.

Vuelva a su primera terminal que todavía está conectada al contenedor. Ejecute algunos comandos que agregan, eliminan o cambian archivos:

/ # touch demo
/ # touch example

Regrese a su primera ventana de shell. Repite el docker diff comando para ver los cambios que se han hecho:

$ docker diff alpine
A /example
C /root
C /root/.ash_history
A /demo

Ahora los dos archivos nuevos son visibles en la salida del comando. Correr touch también agregó entradas al historial de shell del contenedor. la modificación a /root/.ash_history también se informa, así como el consiguiente cambio en la /root directorio.

Interpretación de la salida de Docker Diff

Cada línea de salida producida por docker diff está precedido por cualquiera A, C o D dependiendo del tipo de cambio que ocurrió:

  • A – El archivo o directorio se ha agregado al sistema de archivos del contenedor. No existe en la imagen original.
  • C – El contenido del archivo o directorio es diferente a la versión de la imagen.
  • D – Una ruta que está presente en la imagen se eliminó del contenedor.

Esta información le permite buscar rápidamente discrepancias que podrían explicar la falta de datos o un comportamiento inesperado.

Cualquier cambio en el sistema de archivos que no se muestre en la salida tendrá rutas afectadas que se asignan a un volumen de Docker. Estos archivos se almacenan fuera del contenedor, independientemente de su sistema de archivos, por lo que no aparecen por docker diff .

Ver contenido en la imagen original

Puede ser útil comparar la versión del archivo que se incluye en la imagen original. Puede hacer esto creando un nuevo contenedor y luego copiando el archivo. Usar docker create en vez de docker run por lo que el contenedor se crea pero no se inicia. Esto asegurará que las modificaciones causadas por el script del punto de entrada de la imagen no afecten el resultado.

$ docker create --name temp-container my-image:latest
$ docker cp temp-container:/path/to/file copied-file
$ docker rm temp-container

Una forma alternativa es ejecutar el contenedor con un punto de entrada personalizado que emite el contenido del archivo al flujo de salida estándar. Incluir la --rm marca para que el contenedor se elimine automáticamente después de que se complete el comando:

$ docker run --rm --entrypoint cat alpine:latest /path/to/file > copied-file

Comparando las diferencias entre dos contenedores

A veces, es posible que deba comparar las diferencias entre dos contenedores diferentes que ejecutan la misma imagen. Primer uso docker diff para obtener las listas de cambios individuales:

$ docker diff first-container > first
$ docker diff second-container > second

Ahora puede utilizar las herramientas estándar de Unix, como el diff Comando para encontrar las diferencias en las dos listas de cambios:

diff first second
3c3
< A /a-new-file
---
> A /demo

La diferencia muestra que /a-new-file ha sido removido en el segundo contenedor mientras /demo ha sido añadido.

Otra forma de comparar contenedores es usar docker export y el comando tar para acceder a una lista completa de archivos:

$ docker export demo-container | tar tv
-rwxr-xr-x 0/0               0 2022-06-21 14:21 .dockerenv
drwxr-xr-x 0/0               0 2022-05-23 17:51 bin/
lrwxrwxrwx 0/0               0 2022-05-23 17:51 bin/arch -> /bin/busybox
lrwxrwxrwx 0/0               0 2022-05-23 17:51 bin/ash -> /bin/busybox
lrwxrwxrwx 0/0               0 2022-05-23 17:51 bin/base64 -> /bin/busybox
lrwxrwxrwx 0/0               0 2022-05-23 17:51 bin/bbconfig -> /bin/busybox
...

Repita este comando para ambos contenedores. A continuación, puede utilizar diff para comparar las dos listas. La salida mejorada de tar puede ayudarlo a rastrear cuándo cambiaron los archivos a medida que se muestran los tiempos de modificación y los permisos.

Resumen

Los sistemas de archivos de los contenedores Docker deben parecerse mucho a la imagen a partir de la cual se crearon. Pueden ocurrir discrepancias cuando el software dentro del contenedor escribe contenido directamente en el sistema de archivos. Los usuarios pueden ser otra fuente de diferencias, cuando mecanismos como docker exec se utilizan para ejecutar comandos dentro de un contenedor en ejecución.

los docker diff La utilidad proporciona una manera conveniente de ver estos cambios. Aunque no puede ver por qué se agregó o eliminó un archivo, la capacidad de recuperar una lista de modificaciones puede ser invaluable para comprender por qué se observa un comportamiento particular.

En este artículo nos hemos centrado en examinar los cambios realizados en los contenedores en ejecución. Puedes usar diferentes herramientas como docker history y Dive para inspeccionar los cambios realizados en las capas dentro de una imagen de Docker. Los dos enfoques se pueden usar en conjunto, lo que le permite determinar el punto exacto en que se agregó o modificó un archivo dentro de la pila de capas de un contenedor.





Source link-39