Мне не часто приходится создавать Docker-образы с нуля, но всякий раз после этого возникают одни и те же вопросы:
— А точно ли туда попало всё, что нужно?
— А не попало ли туда что-то лишнее?
— Как вообще выглядит структура папок и файлов внутри образа? 🤔
Особенно много таких вопросов возникает при использовании всяких "нетрадиционных" инструментов, которые обходятся без явного
Dockerfile-а, например, Google Jib или Buildpack. Я рассказывал о них в докладе на конференции Joker в 2020 году: https://toparvion.pro/event/2020/joker/ 🍿Обычно ответы на эти вопросы получают путём запуска контейнера из образа и входа в него с каким-нибудь
bash-ем, чтобы походить по файловой системе и посмотреть, что там лежит. Но что если контейнер не запускается или его пока нельзя запускать? И как понять, откуда именно в контейнере взялась та или иная часть директорий или файлов? 🧐Подобные задачи отлично решает консольная утилита Dive. Она умеет доставать образы из Docker-демона, анализировать их и показывать:
● из каких слоёв состоит образ (даже если он создан не по Dockerfile'у)
● сколько весит каждый слой
● какие файлы и директории создаёт/меняет/удаляет каждый слой на финальной файловой системе контейнера 🔬
Дополнительно Dive умеет подсчитывать условную "эффективность образа" — это доля размера образа, которая не была потрачена на дублирование или перемещение файлов между слоями. Ни разу не видел, чтобы эта цифра была сколь-нибудь значимой, но звучит прикольно🙂
Лично для меня отдельной большой ценностью утилиты стала возможность просмотра прав на чтение/запись/исполнение каждого файла в образе — это сильно помогает, когда пытаешься понять, из-за чего в контейнере что-то ломается с ошибкой "Permission Denied" 🔐
Если вы еще не пользовались этой штукой, ответственно рекомендую попробовать. К тому же сделать это предельно просто: Dive — это всего-навсего один исполняемый файл, который не требует инсталляции и в 95% случаев обходится без настроек. Вот бы все наши вспомогательные #инструменты были такими же, да?..🤩