Los contenedores Docker heredan su sistema de archivos de 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 el contenedor. capa de escritura.
La capacidad de escanear los cambios del sistema de archivos puede ayudarlo a depurar e investigar los datos perdidos. Los archivos escritos en el sistema de archivos del contenedor se perderán cuando el contenedor se reinicie o se destruya. En algunos casos, puede realizar inadvertidamente operaciones de escritura que deberían dirigirse a un archivo El sonido Mientras que.
En este artículo, compartiremos algunas técnicas para identificar las modificaciones realizadas en los sistemas de archivos de contenedores. Puede utilizar esta información para realizar un seguimiento de la actividad del contenedor e investigar las incoherencias entre diferentes entornos.
Uso de diferencias de Docker
La CLI de Docker tiene un comando integrado para esto. administración docker diff
Contará todos los cambios realizados en archivos y directorios dentro de un contenedor en particular. Acepta el identificador o nombre del contenedor que desea escanear.
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 alpina. La ventana de la terminal se adjuntará al contenedor. Deje esta ventana abierta.
ahora corriendo docker diff
En una segunda sesión de terminal:
$ docker diff alpine
No se produjo ningún resultado porque el nuevo contenedor aún coincide perfectamente con el sistema de archivos de imágenes alpine.
Regrese a la primera terminal que aún está unida al contenedor. Ejecute algunos comandos que agregan, eliminan o cambian archivos:
/ # touch demo / # touch example
Regrese a la primera ventana de shell. Repetición docker diff
El comando para ver los cambios realizados:
$ docker diff alpine A /example C /root C /root/.ash_history A /demo
Los dos nuevos archivos ahora aparecen en la salida del comando. administración touch
También agregó entradas al historial de contenedores del contenedor. editar a /root/.ash_history
El cambio resultante también ha sido informado en /root
Guía.
Interpretación de la salida de Docker Diff
Cada línea de producción es producida por docker diff
prefijado con cualquiera de ellos A
Y el C
o D
Según el tipo de cambio que se haya producido:
A
– El archivo o directorio se ha agregado al sistema de archivos del contenedor. Ninguno en la imagen original.C
– El contenido del archivo o directorio es diferente a la versión de la imagen.D
– La ruta de la imagen se ha eliminado del contenedor.
Esta información le permite buscar rápidamente incoherencias que puedan explicar la falta de datos o un comportamiento inesperado.
Cualquier cambio en el sistema de archivos que no aparezca en la salida afectará las rutas asignadas al volumen de Docker. Estos archivos se almacenan fuera del contenedor, independientemente de su sistema de archivos, por lo que no son vistos por docker diff
.
Mostrar el contenido en la imagen original
Puede ser útil comparar la versión del archivo incluido con la imagen original. Puede hacer esto creando un nuevo contenedor y luego copiando el archivo. Usos docker create
en vez de docker run
Entonces, el contenedor se creó pero no se inició. Esto asegurará que las modificaciones inducidas por el script en el 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
Un método alternativo es ejecutar el contenedor con un punto de entrada personalizado que envía el contenido del archivo al flujo de salida estándar. Incluir --rm
Marque para que el contenedor se elimine automáticamente después de completar el comando:
$ docker run --rm --entrypoint cat alpine:latest /path/to/file > copied-file
Compara 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 listas de cambios individuales:
$ docker diff first-container > first $ docker diff second-container > second
Ahora puede usar herramientas estándar de Unix como diff
Comando para encontrar diferencias en dos listas de cambios:
diff first second 3c3 < A /a-new-file --- > A /demo
La diferencia muestra que /a-new-file
Se retiró en el segundo contenedor durante /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 cada uno de sus contenedores. A continuación, puede utilizar archivos diff
Para comparar las dos listas. La salida tar mejorada puede ayudarlo a rastrear cuándo se han cambiado los archivos mientras muestra los tiempos y permisos de modificación.
Resumen
Los sistemas de archivos del contenedor Docker deben parecerse a la imagen a partir de la cual se crean. Pueden ocurrir inconsistencias cuando el programa dentro del contenedor escribe el contenido directamente en el sistema de archivos. Los usuarios pueden ser otra fuente de diferencias, cuando mecanismos como docker exec
Se utiliza para ejecutar comandos dentro de un contenedor en ejecución.
los docker diff
La herramienta proporciona una manera conveniente de ver estos cambios. Aunque no puede saber por qué se agregó o eliminó un archivo, poder recuperar la lista de modificaciones puede ser muy valioso para comprender por qué se observa un comportamiento particular.
En este artículo, nos enfocamos en examinar los cambios realizados en los contenedores en ejecución. Puedes usar diferentes herramientas como docker history
y buceo Comprueba los cambios realizados en las capas dentro de una imagen de Docker. Los dos métodos se pueden usar en conjunto, lo que le permite especificar el punto exacto en el que se agregó o modificó un archivo dentro de la pila de capas del contenedor.
More Stories
El código en los datos previos al entrenamiento mejora el rendimiento del LLM en tareas que no son de codificación
Un marco para resolver ecuaciones diferenciales parciales equivalentes puede guiar el procesamiento y la ingeniería de gráficos por computadora
Epiroc ha lanzado una nueva plataforma de perforación de producción de pozos largos