Как использовать docker buildx history trace для просмотра трассировок сборки

DockerDockerBeginner
Практиковаться сейчас

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

В этой лабораторной работе вы научитесь использовать команду docker buildx history trace для просмотра и анализа трассировки сборки ваших Docker-образов. Вы начнёте с создания простого Docker-образа и записи его истории сборки с использованием стандартных команд Docker.

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


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL docker(("Docker")) -.-> docker/ImageOperationsGroup(["Image Operations"]) docker(("Docker")) -.-> docker/DockerfileGroup(["Dockerfile"]) docker(("Docker")) -.-> docker/ContainerOperationsGroup(["Container Operations"]) docker/ContainerOperationsGroup -.-> docker/inspect("Inspect Container") docker/ImageOperationsGroup -.-> docker/images("List Images") docker/DockerfileGroup -.-> docker/build("Build Image from Dockerfile") subgraph Lab Skills docker/inspect -.-> lab-555056{{"Как использовать docker buildx history trace для просмотра трассировок сборки"}} docker/images -.-> lab-555056{{"Как использовать docker buildx history trace для просмотра трассировок сборки"}} docker/build -.-> lab-555056{{"Как использовать docker buildx history trace для просмотра трассировок сборки"}} end

Сборка образа и запись его истории

На этом шаге вы узнаете, как собрать Docker-образ и записать его историю сборки. Docker-образы собираются из Dockerfile — текстового файла, содержащего все команды, которые пользователь мог бы выполнить в командной строке для создания образа.

Сначала создадим простой Dockerfile. Перейдите в директорию ~/project, если вы ещё не там.

cd ~/project

Теперь создадим файл Dockerfile с помощью редактора nano.

nano Dockerfile

Добавьте следующее содержимое в Dockerfile:

FROM ubuntu:latest
RUN apt-get update && apt-get install -y --no-install-recommends fortune-mod
CMD ["/usr/games/fortune"]

Этот Dockerfile использует последний образ Ubuntu, обновляет список пакетов, устанавливает пакет fortune-mod и задаёт команду по умолчанию для запуска программы fortune.

Сохраните файл и выйдите из nano (нажмите Ctrl + X, затем Y, затем Enter).

Теперь соберём Docker-образ с помощью команды docker build. Мы присвоим образу тег my-fortune-image и используем текущую директорию (.) в качестве контекста сборки.

docker build -t my-fortune-image .

Вы увидите вывод, показывающий процесс сборки, включая загрузку базового образа и выполнение команды apt-get.

Для записи истории сборки можно использовать команду docker history. Эта команда показывает историю образа.

docker history my-fortune-image

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

Просмотр записей истории сборки

На этом шаге вы подробнее узнаете о просмотре записей истории сборки Docker-образа. Как вы видели в предыдущем шаге, команда docker history предоставляет детальную информацию о слоях, из которых состоит образ.

Давайте снова выполним команду docker history для образа my-fortune-image, который мы собрали ранее.

docker history my-fortune-image

Вывод команды содержит несколько столбцов:

  • IMAGE: ID слоя образа
  • CREATED: Временная метка создания слоя
  • CREATED BY: Команда, создавшая слой
  • SIZE: Размер слоя
  • COMMENT: Связанные с слоем комментарии

Каждая строка вывода представляет собой слой образа. Слои перечислены от самого нового (вверху) до самого старого (внизу). Базовый образ (ubuntu:latest в нашем случае) находится в самом низу.

Вы также можете использовать флаг -q для вывода только ID образов.

docker history -q my-fortune-image

Это может быть полезно, если вам нужны только ID слоёв для скриптов или других целей.

Команда docker history является мощным инструментом для анализа структуры Docker-образа и отладки проблем, связанных с его слоями.

Просмотр OpenTelemetry трассировки записи сборки

На этом шаге вы узнаете, как просмотреть OpenTelemetry трассировку записи сборки Docker. OpenTelemetry — это набор инструментов, API и SDK для инструментирования, генерации, сбора и экспорта телеметрических данных (метрик, логов и трассировок), помогающих анализировать производительность и поведение вашего ПО. Docker может интегрироваться с OpenTelemetry для предоставления детальной трассировки процесса сборки.

Для просмотра OpenTelemetry трассировки необходимо включить её при сборке образа. Мы пересоберём образ my-fortune-image с включённой трассировкой.

Сначала убедитесь, что находитесь в директории ~/project.

cd ~/project

Теперь соберём образ заново, но на этот раз установим переменную окружения BUILDKIT_TRACE для активации трассировки. Также используем флаг --progress=plain для прямого вывода процесса сборки.

BUILDKIT_TRACE=trace.json docker build --progress=plain -t my-fortune-image .

Эта команда пересоберёт образ и сохранит данные OpenTelemetry трассировки в файл trace.json в текущей директории.

После завершения сборки вы можете просмотреть содержимое файла trace.json. Этот файл содержит данные трассировки в формате JSON.

cat trace.json

Вывод будет представлять собой крупный JSON-объект с детальной информацией о процессе сборки, включая длительность каждого шага, зависимости и другие метаданные. Эти данные трассировки можно импортировать в совместимую с OpenTelemetry систему визуализации (например Jaeger или Zipkin) для анализа.

Хотя мы не будем настраивать полноценную систему трассировки в этой лабораторной работе, понимание процесса генерации файла трассировки — это первый шаг к использованию OpenTelemetry для анализа сборок Docker.

Сравнение трассировок двух записей сборки

На этом шаге вы узнаете, как генерировать и сравнивать OpenTelemetry трассировки двух разных записей сборки Docker. Сравнение трассировок помогает выявлять различия в производительности между сборками, особенно после внесения изменений в Dockerfile или окружение сборки.

Сначала убедитесь, что находитесь в директории ~/project.

cd ~/project

У нас уже есть файл trace.json из предыдущей сборки. Переименуем его в trace1.json для сохранения.

mv trace.json trace1.json

Теперь внесём небольшое изменение в наш Dockerfile и соберём образ снова, создав вторую трассировку. Добавим простую инструкцию LABEL в Dockerfile.

Откройте Dockerfile для редактирования:

nano Dockerfile

Добавьте следующую строку после инструкции CMD:

LABEL version="1.0"

Обновлённый Dockerfile должен выглядеть так:

FROM ubuntu:latest
RUN apt-get update && apt-get install -y --no-install-recommends fortune-mod
CMD ["/usr/games/fortune"]
LABEL version="1.0"

Сохраните файл и выйдите из nano.

Теперь соберём образ снова, создав новый файл трассировки trace2.json.

BUILDKIT_TRACE=trace2.json docker build --progress=plain -t my-fortune-image .

После завершения сборки у вас будет два файла трассировки: trace1.json и trace2.json.

Хотя прямое сравнение сырых JSON-файлов может быть сложным, эти файлы предназначены для обработки системами визуализации OpenTelemetry. В реальных условиях вы бы импортировали оба файла в инструмент визуализации трассировок (например Jaeger). Это позволило бы наглядно сравнить временные линии и промежутки (spans) двух сборок, выявляя различия во времени выполнения и определяя, какие шаги были затронуты изменениями.

Например, при просмотре этих трассировок в Jaeger вы увидите отдельные шаги сборки Docker (FROM, RUN, CMD, LABEL) как spans. Затем можно сравнить длительность этих spans между двумя трассировками, чтобы определить, повлияло ли добавление инструкции LABEL на время сборки.

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

Итоги

В этой лабораторной работе вы научились:

  • Собирать Docker-образ из Dockerfile с помощью команды docker build, присваивая образу тег для удобной идентификации
  • Просматривать историю сборки созданного образа через команду docker history, которая показывает слои и команды, использованные в процессе сборки

Вы также:

  • Изучили детализированный вывод истории сборки, демонстрирующий информацию, доступную через команду docker history
  • Научились просматривать OpenTelemetry трассировку конкретной записи сборки для углублённого анализа процесса
  • Попрактиковались в сравнении трассировок двух разных сборок, что полезно для понимания изменений и отладки проблем сборки