Поиск по сайту:

Анализируйте и сравнивайте образы контейнеров с помощью 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

Статьи по данной тематике