Анализируйте и сравнивайте образы контейнеров с помощью Container-diff
Container-diff — дифференцируйте ваши контейнеры Docker
В этом уроке мы узнаем, что такое Container-diff, как установить Container-diff в различных дистрибутивах Linux и, наконец, как анализировать и сравнивать образы контейнеров с помощью Container-diff.
Введение
У меня есть хорошие новости для тех, кто создает приложения на контейнерах.
Представьте себе этот сценарий. Вы разработчик программного обеспечения. Вы работаете над приложением, над образом контейнера времени выполнения, который поддерживается кем-то другим.
В середине разработки первоначальный создатель образа контейнера выпускает новую версию этого базового образа с обновленными системными пакетами.
Вы загружаете обновленный базовый образ и продолжаете перестраивать на его основе свое приложение. Внезапно ваше приложение перестало работать.
Вы успешно заработали в предыдущем образе, но ваше приложение не работало в последнем базовом образе.
Вы также почти уверены, что приложение хорошо работало на предыдущей версии системных пакетов базового образа, но понятия не имеете, на какой именно. Здесь на помощь приходит "Container-diff".
Что такое Container-diff?
Container-diff – это инструмент с открытым исходным кодом от Google, который помогает анализировать и сравнивать образы контейнеров, размещенные на облачной платформе Google.
Container-diff используется для простого отслеживания изменений, внесенных между двумя базовыми изображениями, чтобы вы могли лучше понять, что действительно изменилось внутри изображений.
Это сэкономит вам много времени на поиск несовместимости версий пакета, и вы сможете решить, следует ли пересобирать приложение на последнем образе контейнера или просто придерживаться старой версии, пока не найдете подходящее обходное решение.
Это также поможет вам легко проверить, будет ли ваше приложение работать с новыми сборками образа контейнера.
Container-diff анализирует следующее в образах контейнеров.
- История образов Docker,
- Файловая система изображений,
- Размер изображения,
- Подходящие пакеты,
- пакеты оборотов,
- пип-пакеты,
- npm-пакеты.
Теперь давайте посмотрим, как установить Container-diff и как использовать его для сравнения образов контейнеров.
Установите Container-diff в Linux
Я тестировал Container-diff в системе Ubuntu. Однако он должен работать в Debian и других вариантах Ubuntu, а также в других дистрибутивах Linux.
Сначала убедитесь, что у вас установлен Docker. Если вы еще не установили его, перейдите по следующей ссылке.
- Как установить Docker в Ubuntu
После установки Docker установите Container-diff в вашей системе Linux, используя следующие команды:
curl -LO https://storage.googleapis.com/container-diff/latest/container-diff-linux-amd64
sudo install container-diff-linux-amd64 /usr/local/bin/container-diff
Или, если вы не хотите использовать sudo, запустите:
curl -LO https://storage.googleapis.com/container-diff/latest/container-diff-linux-amd64
mkdir -p "$HOME/bin"
export PATH="$PATH:$HOME/bin"
install container-diff-linux-amd64 $HOME/bin/container-diff
Если вы используете Arch Linux, вы можете установить Container-diff с помощью следующей команды:
sudo pacman -S container-diff
Анализ образов контейнеров
Сначала давайте проанализируем образ контейнера, например Debian 9, который хранится в реестре контейнеров Google.
container-diff analyze gcr.io/google-appengine/debian9:latest
Пример вывода:
Retrieving image gcr.io/google-appengine/debian9:latest from source Cloud Registry
Retrieving analyses
-----Apt-----
Packages found in gcr.io/google-appengine/debian9:latest:
NAME VERSION SIZE
-adduser 3.115 849K
-apt 1.4.8 3.5M
-base-files 9.9 deb9u2 333K
-base-passwd 3.5.43 229K
-bash 4.4-5 5.7M
-bsdutils 1:2.29.2-1 238K
-ca-certificates 20161130 nmu1 468K
-coreutils 8.26-3 14.7M
-dash 0.5.8-2.4 204K
-debconf 1.5.61 558K
-debian-archive-keyring 2017.5 118K
-debianutils 4.8.1.1 213K
-diffutils 1:3.5-3 1.3M
-dpkg 1.18.24 6.6M
-e2fslibs 1.43.4-2 449K
-e2fsprogs 1.43.4-2 3.9M
-findutils 4.6.0 git+20161106-2 1.8M
-gcc-6-base 6.3.0-18 209K
-gpgv 2.1.18-8~deb9u1 721K
-grep 2.27-2 1.1M
-gzip 1.6-5 b1 231K
-hostname 3.18 b1 47K
-init-system-helpers 1.48 131K
-libacl1 2.2.52-3 b1 62K
-libapt-pkg5.0 1.4.8 3M
-libattr1 1:2.4.47-2 b2 42K
-libaudit-common 1:2.6.7-2 30K
-libaudit1 1:2.6.7-2 150K
-libblkid1 2.29.2-1 367K
-libbz2-1.0 1.0.6-8.1 96K
-libc-bin 2.24-11 deb9u1 3.3M
-libc6 2.24-11 deb9u1 10.4M
-libcap-ng0 0.7.7-3 b1 43K
-libcomerr2 1.43.4-2 83K
-libdb5.3 5.3.28-12 deb9u1 1.8M
-libdebconfclient0 0.227 67K
-libfdisk1 2.29.2-1 469K
-libgcc1 1:6.3.0-18 108K
-libgcrypt20 1.7.6-2 deb9u2 1.2M
-libgpg-error0 1.26-2 572K
-liblz4-1 0.0~r131-2 b1 93K
-liblzma5 5.2.2-1.2 b1 339K
-libmount1 2.29.2-1 403K
-libncursesw5 6.0 20161126-1+deb9u1 347K
-libpam-modules 1.1.8-3.6 874K
-libpam-modules-bin 1.1.8-3.6 220K
-libpam-runtime 1.1.8-3.6 1016K
-libpam0g 1.1.8-3.6 229K
-libpcre3 2:8.39-3 668K
-libselinux1 2.6-3 b3 209K
-libsemanage-common 2.6-2 39K
-libsemanage1 2.6-2 291K
-libsepol1 2.6-2 653K
-libsmartcols1 2.29.2-1 257K
-libss2 1.43.4-2 95K
-libssl1.1 1.1.0f-3 deb9u1 3.4M
-libstdc++6 6.3.0-18 2M
-libsystemd0 232-25 deb9u1 652K
-libtinfo5 6.0 20161126-1+deb9u1 478K
-libudev1 232-25 deb9u1 222K
-libustr-1.0-1 1.0.4-6 258K
-libuuid1 2.29.2-1 107K
-login 1:4.4-4.1 2.7M
-lsb-base 9.20161125 49K
-mawk 1.3.3-17 b3 183K
-mount 2.29.2-1 444K
-multiarch-support 2.24-11 deb9u1 220K
-ncurses-base 6.0 20161126-1+deb9u1 340K
-ncurses-bin 6.0 20161126-1+deb9u1 536K
-netbase 5.4 44K
-openssl 1.1.0f-3 deb9u1 1.2M
-passwd 1:4.4-4.1 2.4M
-perl-base 5.24.1-3 deb9u2 7.4M
-sed 4.4-1 799K
-sensible-utils 0.0.9 110K
-sysvinit-utils 2.88dsf-59.9 110K
-tar 1.29b-1.1 2.7M
-tzdata 2017c-0 deb9u1 2.9M
-util-linux 2.29.2-1 3.5M
-zlib1g 1:1.2.8.dfsg-5 156K
Как видите, Container-diff отображает анализ APT без указания флага --type
.
Список доступных анализаторов:
- --type=история [История]
- --type=файл [Файловая система]
- --type=пип [пип]
- --type=подход [Подход]
- --type=узел [Узел]
Вы можете запустить несколько анализаторов одновременно, как показано ниже.
container-diff analyze gcr.io/google-appengine/debian9:latest --type=history --type=apt --type=file
Сравните изображения контейнеров с помощью Container-diff
Чтобы сравнить два изображения контейнеров, используйте следующую команду:
container-diff diff gcr.io/google-appengine/debian9:latest gcr.io/google-appengine/debian9:2017-10-18-191738
Здесь я сравниваю два образа контейнера: образ последней сборки Debian 9 и образ Debian 9, созданный 18 октября 2017 года.
Пример вывода:
Starting diff on images gcr.io/google-appengine/debian9:latest and gcr.io/google-appengine/debian9:2017-10-18-191738, using differs: [apt]
Retrieving image gcr.io/google-appengine/debian9:2017-10-18-191738 from source Cloud Registry
Retrieving image gcr.io/google-appengine/debian9:latest from source Cloud Registry
Computing diffs
-----Apt-----
Packages found only in gcr.io/google-appengine/debian9:latest: None
Packages found only in gcr.io/google-appengine/debian9:2017-10-18-191738: None
Version differences:
PACKAGE IMAGE1 (gcr.io/google-appengine/debian9:latest) IMAGE2 (gcr.io/google-appengine/debian9:2017-10-18-191738)
-libssl1.1 1.1.0f-3 deb9u1, 3.4M 1.1.0f-3, 3.4M
-openssl 1.1.0f-3 deb9u1, 1.2M 1.1.0f-3, 1.2M
-tzdata 2017c-0 deb9u1, 2.9M 2017b-1, 2.9M
Как вы можете видеть в выводе, в последней сборке были обновлены три пакета.
Если между двумя изображениями нет различий, вы увидите результат, подобный приведенному ниже.
Computing diffs
-----Apt-----
Packages found only in gcr.io/google-appengine/debian9:latest: None
Packages found only in gcr.io/google-appengine/debian9:2017-11-27-220229: None
Version differences: None
Как я уже говорил, по умолчанию, если не указан флаг --type
,Container-diff запустит анализ пакета Apt.
Мы можем запустить несколько анализаторов одновременно, как показано ниже.
container-diff diff gcr.io/google-appengine/debian9:latest gcr.io/google-appengine/debian9:2017-10-18-191738 --type=history --type=apt --type=node
Здесь я использую три анализатора, а именно history, apt и node.
Пример вывода:
Starting diff on images gcr.io/google-appengine/debian9:latest and gcr.io/google-appengine/debian9:2017-10-18-191738, using differs: [history apt node]
Retrieving image gcr.io/google-appengine/debian9:2017-10-18-191738 from source Cloud Registry
Retrieving image gcr.io/google-appengine/debian9:latest from source Cloud Registry
Computing diffs
-----Apt-----
Packages found only in gcr.io/google-appengine/debian9:latest: None
Packages found only in gcr.io/google-appengine/debian9:2017-10-18-191738: None
Version differences:
PACKAGE IMAGE1 (gcr.io/google-appengine/debian9:latest) IMAGE2 (gcr.io/google-appengine/debian9:2017-10-18-191738)
-libssl1.1 1.1.0f-3 deb9u1, 3.4M 1.1.0f-3, 3.4M
-openssl 1.1.0f-3 deb9u1, 1.2M 1.1.0f-3, 1.2M
-tzdata 2017c-0 deb9u1, 2.9M 2017b-1, 2.9M
-----History-----
Docker history lines found only in gcr.io/google-appengine/debian9:latest: None
Docker history lines found only in gcr.io/google-appengine/debian9:2017-10-18-191738: None
-----Node-----
Packages found only in gcr.io/google-appengine/debian9:latest: None
Packages found only in gcr.io/google-appengine/debian9:2017-10-18-191738: None
Version differences: None
Вы также можете сравнить локально сохраненное изображение с удаленным изображением, как показано ниже.
container-diff diff daemon://modified_debian:latest remote://gcr.io/google-appengine/debian9:latest
Для получения более подробной информации обратитесь к официальным ссылкам Container-diff, приведенным ниже.
Ресурсы:
- Блог Google с открытым исходным кодом
- Container-diff Репозиторий Github