🐳 Как проверить изменения в файловой системе контейнера Docker |

🐳 Как проверить изменения в файловой системе контейнера Docker

Мануал

Контейнеры Docker наследуют файловую систему своего образа при первоначальном создании.

Файловая система контейнера может отличаться от содержимого образа после его создания, если были внесены изменения в записываемый слой контейнера.

Возможность проверить изменения в файловой системе может помочь вам отладить проблемы и обнаружить недостающие данные.

Файлы, записанные в файловую систему контейнера, будут потеряны при перезапуске или уничтожении этого контейнера.

В некоторых случаях вы можете непреднамеренно выполнять запись, которая должна быть направлена на постоянный том.

В этой статье мы поделимся некоторыми методами идентификации изменений, внесенных в файловые системы контейнеров.

Вы можете использовать эту информацию для отслеживания активности контейнеров и изучения расхождений между различными средами.

Использование Docker Diff

В Docker CLI есть встроенная команда для этой цели.

Запуск команды docker diff перечислит все изменения, внесенные в файлы и каталоги внутри определенного контейнера.

Команда принимает ID или имя контейнера, который вы хотите проверить.

Запустите простой контейнер для демонстрации:

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

Это приведет к запуску нового контейнера с образом Alpine.

Ваше окно терминала будет прикреплено к контейнеру.

Держите это окно открытым.

Теперь запустите docker diff во втором сеансе терминала:

docker diff alpine

Никакого вывода не будет, поскольку свежий контейнер по-прежнему точно соответствует файловой системе образа Alpine.

Переключитесь обратно на первый терминал, который все еще подключен к контейнеру.

Выполните несколько команд, которые добавляют, удаляют или изменяют файлы:

/ # touch demo
/ # touch example

Вернитесь в первое окно оболочки.

Повторите команду docker diff, чтобы увидеть внесенные изменения:

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

Теперь два новых файла видны на выводе команды.

Выполнение команды touch также добавило записи в историю оболочки контейнера.

Об изменении /root/.ash_history также сообщается, как и о последующем изменении каталога /root.

Интерпретация вывода Docker Diff

Каждая строка вывода docker diff имеет префикс A, C или D в зависимости от типа произошедшего изменения:

  • A – Файл или каталог был добавлен в файловую систему контейнера. Он не существовал в исходном образе.
  • C – Содержимое файла или каталога отличается от версии в образе.
  • D – Путь, присутствующий в образе, был удален из контейнера.

Эта информация позволяет быстро найти несоответствия, которые могут объяснить отсутствующие данные или неожиданное поведение.

Любые изменения файловой системы, которые не отображаются в выводе, затрагивают пути, сопоставленные с томом Docker.

Эти файлы хранятся вне контейнера, независимо от его файловой системы, поэтому они не отображаются docker diff.

Просмотр содержимого исходного образа

Бывает полезно сравнить версию файла, включенного в исходный образ.

Для этого можно создать новый контейнер, а затем скопировать из него файл.

Используйте docker create вместо docker run, чтобы контейнер был создан, но не запущен.

Это гарантирует, что изменения, вызванные скриптом точки входа образа, не повлияют на результат.

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

Альтернативный способ – запустить контейнер с пользовательской точкой входа, которая выводит содержимое файла в стандартный поток вывода.

Включите флаг –rm, чтобы контейнер автоматически удалялся после завершения команды:

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

Сравнение различий между двумя контейнерами

Иногда вам может понадобиться сравнить различия между двумя разными контейнерами с одного образа.

Сначала используйте docker diff для получения индивидуальных списков изменений:

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

Теперь вы можете использовать стандартные инструменты Unix, такие как команда diff, чтобы найти различия в двух списках изменений:

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

Разница показывает, что /a-new-file был удален во втором контейнере, а /demo был добавлен.

Другой способ сравнить контейнеры – использовать docker export и команду tar для получения доступа к полному списку файлов:

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
...

Повторите эту команду для обоих контейнеров.

Затем вы можете использовать diff для сравнения двух списков.
Расширенный вывод tar может помочь вам отследить время изменения файлов, так как отображается время модификации и права.

Заключение

Файловые системы контейнеров Docker должны быть очень похожи на образ, на основе которого они были созданы.

Расхождения могут возникать в тех случаях, когда программное обеспечение внутри контейнера записывает содержимое непосредственно в файловую систему.

Пользователи могут быть еще одним источником расхождений, когда такие механизмы, как docker exec, используются для выполнения команд внутри запущенного контейнера.

см. также:
Добавить комментарий