1. Обзор
2. Об образах Docker
3. Изучение образа Docker
$ docker image ls
spring-petclinic 2.7.0-SNAPSHOT 0f9d2d05687b 2 months ago 266MB
spring-petclinic 2.6.0-SNAPSHOT 1d79d5bd7779 3 months ago 265MB
$ docker inspect 0f9d2d05687b
[
{
"Id": "sha256:0f9d2d05687b8c816cbf54f63cf7e5aa7144d28e1996d468bfaf555a3882610a",
"RepoTags": [
"spring-petclinic:2.7.0-SNAPSHOT"
],
"Architecture": "amd64",
"Os": "linux",
"Size": 266141567,
"VirtualSize": 266141567,
...
}
]
Эта команда дает нам множество подробностей об образе, включая время его создания, различные слои внутри него и многое другое.
Однако она не может рассказать нам о содержимом изображения.
Для этого нам нужно сначала сохранить изображение в файловой системе:
$ docker save 0f9d2d05687b > 0f9d2d05687b.tar
Эта команда сохранит изображение в виде tar-файла.
Теперь мы можем использовать привычную команду tar для его изучения:
$ tar tvf 0f9d2d05687b.tar
drwxr-xr-x 0 0 0 0 Dec 31 1979 02805fa4a4f35efdcf3804bc1218af1bc22d28ee521cc944cab5cac5dbe5abfe/
-rw-r--r-- 0 0 0 3 Dec 31 1979 02805fa4a4f35efdcf3804bc1218af1bc22d28ee521cc944cab5cac5dbe5abfe/VERSION
-rw-r--r-- 0 0 0 477 Dec 31 1979 02805fa4a4f35efdcf3804bc1218af1bc22d28ee521cc944cab5cac5dbe5abfe/json
-rw-r--r-- 0 0 0 1024 Dec 31 1979 02805fa4a4f35efdcf3804bc1218af1bc22d28ee521cc944cab5cac5dbe5abfe/layer.tar
drwxr-xr-x 0 0 0 0 Dec 31 1979 0f915e8772f0e40420852f1e2929e4ae9408327cbda6c546c71cca7c3e2f094a/
-rw-r--r-- 0 0 0 3 Dec 31 1979 0f915e8772f0e40420852f1e2929e4ae9408327cbda6c546c71cca7c3e2f094a/VERSION
-rw-r--r-- 0 0 0 477 Dec 31 1979 0f915e8772f0e40420852f1e2929e4ae9408327cbda6c546c71cca7c3e2f094a/json
-rw-r--r-- 0 0 0 3622400 Dec 31 1979 0f915e8772f0e40420852f1e2929e4ae9408327cbda6c546c71cca7c3e2f094a/layer.tar
Команда tar может перечислить и извлечь из образа определенные файлы, в зависимости от того, какую информацию мы ищем.
4. Выявление различий между двумя образами Docker
Итак, мы рассмотрели структуру образа и способы его проверки.
Далее давайте посмотрим, как можно сравнить два образа и найти их различия.
В зависимости от того, какую информацию мы хотим сравнить, существуют различные инструменты, которые могут помочь в этом.
Как мы увидели выше, встроенная команда image может дать нам информацию о размере и дате.
Но если мы хотим сравнить содержимое двух образов, нам придется воспользоваться сторонним инструментом.
Ниже мы рассмотрим несколько из них.
4.1. dff
Один из таких инструментов – container-diff от Google.
Несмотря на свое название, он может сравнивать различные аспекты двух образов и предоставлять отчет в красивом формате.
Например, давайте сравним два образа Spring из предыдущего примера:
$ /usr/local/bin/container-diff diff \
daemon://spring-petclinic:2.6.0-SNAPSHOT \
daemon://spring-petclinic:2.7.0-SNAPSHOT \
--type=file
Система выдает нам различия в файлах каждого образа.
Вывод обычно разбивается на три части.
Во-первых, он показывает, какие файлы существуют в первом образе, но отсутствуют во втором:
/workspace/BOOT-INF/lib/byte-buddy-1.12.10.jar 3.7M
/workspace/BOOT-INF/lib/classgraph-4.8.139.jar 551.7K
/workspace/BOOT-INF/lib/ehcache-3.10.0.jar 1.7M
/workspace/BOOT-INF/lib/h2-2.1.212.jar 2.4M
/workspace/BOOT-INF/lib/hibernate-core-5.6.9.Final.jar 7.1M
/workspace/BOOT-INF/lib/jackson-annotations-2.13.3.jar 73.9K
Далее он сообщает нам, какие файлы есть во втором образе, но нет в первом:
These entries have been deleted from spring-petclinic:2.6.0-SNAPSHOT:
FILE SIZE
/workspace/BOOT-INF/lib/byte-buddy-1.11.22.jar 3.5M
/workspace/BOOT-INF/lib/classgraph-4.8.115.jar 525.4K
/workspace/BOOT-INF/lib/ehcache-3.9.9.jar 1.7M
/workspace/BOOT-INF/lib/h2-1.4.200.jar 2.2M
/workspace/BOOT-INF/lib/hibernate-core-5.6.7.Final.jar 7.1M
/workspace/BOOT-INF/lib/jackson-annotations-2.13.2.jar 73.9K
В этом случае две секции, объединенные вместе, могут очень быстро рассказать нам о том, как изменились зависимости между каждой версией приложения.
И наконец, последняя секция показывает, какие файлы существуют в обеих версиях, но отличаются друг от друга:
These entries have been changed between spring-petclinic:2.6.0-SNAPSHOT and spring-petclinic:2.7.0-SNAPSHOT:
FILE SIZE1 SIZE2
/layers/config/metadata.toml 16.6K 1.9K
/workspace/META-INF/maven/org.springframework.samples/spring-petclinic/pom.xml 13.3K 13.3K
/workspace/BOOT-INF/classes/org/springframework/samples/petclinic/owner/OwnerController.class 7.8K 7.7K
/workspace/org/springframework/boot/loader/ExecutableArchiveLauncher.class 6.6K 7.5K
/workspace/org/springframework/boot/loader/JarLauncher.class 3.9K 2.5K
/workspace/BOOT-INF/classpath.idx 3.2K 3.2K
/workspace/org/springframework/boot/loader/data/RandomAccessDataFile$FileAccess.class 3.2K 3.2K
/workspace/BOOT-INF/classes/db/h2/data.sql 2.8K 3K
/workspace/org/springframework/boot/loader/data/RandomAccessDataFile$DataInputStream.class 2.6K 2.7K
Этот раздел позволяет легко определить, какие именно классы и файлы свойств изменились в двух версиях.
4.2. Dive
Еще одним отличным инструментом с открытым исходным кодом для проверки образов Docker является dive.
Проверка образов с помощью dive дает нам более традиционный взгляд на их содержимое, поскольку он понимает, как исследовать каждый слой внутри образа.
Это позволяет ему представить каждый образ в виде традиционного дерева файловой системы:
Ранее уже был рассмотрен:
🐳 10 инструментов, дополняющих Docker
С помощью клавиатуры мы можем перемещаться по каждому слою образа и увидеть, какие именно файлы были добавлены, изменены или удалены.
Хотя инструмент погружения не поддерживает сравнение, мы можем сделать это вручную, просто запустив его на двух терминалах рядом друг с другом.
5. Заключение
В этой статье мы рассмотрели структуру образов Docker и различные способы их проверки.
Хотя клиент Docker содержит некоторые инструменты для проверки отдельных образов, сравнение двух образов требует использования сторонних инструментов.
Контейнер-diff от Google – это один из вариантов, созданный специально для сравнения образов.
И хотя утилита diff отлично подходит для проверки слоя одного образа, ее также можно использовать для выявления различий, просто запустив ее на двух образах одновременно.
см. также:
- 🐳 Как обновить образ Docker c новыми изменениями?
- ☸️ Как опубликовать образ Docker в Docker Hub с помощью Podman
- 🐳 Сборка Docker-образов с многопроцессорной архитектурой с помощью Buildx
- 🐳 Переключение пользователя в образе или контейнере Docker
- 🐳 Как хранить образы и контейнеры Docker на внешнем диске
- 🐳 Как добавлять, заменять и удалять теги образов Docker
- 🐳 Как проверить использование дискового пространства образов, контейнеров и томов Docker
- 🐳 Быстрый способ удалить все образы Docker с вашего хоста