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.