Введение
В этой лабораторной работе вы научитесь эффективно использовать команду docker buildx debug build для сборки и анализа Docker-образов. Вы начнёте с создания простого образа с настройками по умолчанию, используя Dockerfile.
Освоив основы, вы перейдёте к более сложным сценариям сборки, включая добавление аргументов сборки (build arguments) и меток (labels) в образы. Вы также узнаете, как указывать целевые платформы (target platforms) в процессе сборки и сохранять результирующий образ в файл. В завершение лабораторная работа познакомит вас с методами управления кешем сборки (build cache) и безопасного использования секретов (secrets) во время сборки, что даст вам полное представление о возможностях команды docker buildx debug build.
Сборка простого образа с настройками по умолчанию
На этом шаге вы научитесь собирать простой Docker-образ с использованием Dockerfile. Dockerfile — это текстовый документ, содержащий все команды, которые пользователь может выполнить в командной строке для сборки образа. Docker может автоматически собирать образы, читая инструкции из Dockerfile.
Сначала перейдите в директорию ~/project, которая является рабочей для этой лабораторной работы.
cd ~/project
Теперь создадим простой Dockerfile. Мы создадим файл с именем Dockerfile в директории ~/project. Этот Dockerfile будет определять шаги для создания образа на основе базового образа ubuntu с установленным пакетом cowsay.
Используйте редактор nano для создания и редактирования Dockerfile:
nano Dockerfile
Добавьте следующее содержимое в Dockerfile:
FROM ubuntu:latest
RUN apt-get update && apt-get install -y cowsay
CMD ["cowsay", "Hello, Docker!"]
Разберём этот Dockerfile:
FROM ubuntu:latest: Эта инструкция указывает базовый образ для нашего нового образа. Мы используем последнюю версию официального образа Ubuntu из Docker Hub.RUN apt-get update && apt-get install -y cowsay: Эта инструкция выполняет команды в новом слое поверх текущего образа и сохраняет результат. Здесь мы обновляем список пакетов и устанавливаемcowsay. Флаг-yавтоматически подтверждает ответ "да" на запросы.CMD ["cowsay", "Hello, Docker!"]: Эта инструкция задаёт команды по умолчанию для запускаемого контейнера. Если контейнер запускается из этого образа без указания команды, он выполнитcowsay "Hello, Docker!".
Сохраните файл, нажав Ctrl + X, затем Y и Enter.
Теперь, когда у нас есть Dockerfile, мы можем собрать образ. Используйте команду docker build. Символ . в конце команды указывает Docker искать Dockerfile в текущей директории (~/project). Мы также присвоим образу имя, например, my-cowsay-image.
docker build -t my-cowsay-image .
Эта команда выполнит инструкции из Dockerfile шаг за шагом. Вы увидите вывод, показывающий обработку каждого шага, включая загрузку базового образа (если он ещё не загружен) и установку cowsay.
После завершения сборки вы можете проверить успешность создания образа, выведя список доступных образов с помощью команды docker images:
docker images
В выводе должен отобразиться my-cowsay-image.
Наконец, запустим контейнер из только что собранного образа, чтобы убедиться, что он работает как ожидается.
docker run my-cowsay-image
Эта команда создаст и запустит новый контейнер на основе my-cowsay-image. Поскольку мы определили инструкцию CMD в Dockerfile, контейнер автоматически выполнит cowsay "Hello, Docker!", и вы увидите корову, говорящую "Hello, Docker!" в выводе терминала.
Сборка образа с аргументами сборки и метками
На этом шаге вы научитесь использовать аргументы сборки (ARG) и метки (LABEL) в вашем Dockerfile. Аргументы сборки позволяют передавать переменные в процесс сборки, делая ваш Dockerfile более гибким. Метки — это пары ключ-значение, которые можно добавить к образу для хранения метаданных.
Сначала убедитесь, что находитесь в директории ~/project:
cd ~/project
Теперь модифицируем Dockerfile, созданный на предыдущем шаге. Мы добавим аргумент сборки для настройки сообщения, выводимого cowsay, и метку к образу.
Откройте Dockerfile для редактирования:
nano Dockerfile
Измените содержимое, добавив инструкции ARG и LABEL:
FROM ubuntu:latest
ARG MESSAGE="Hello, Docker!"
RUN apt-get update && apt-get install -y cowsay
LABEL maintainer="Your Name <your.email@example.com>"
CMD ["cowsay", "$MESSAGE"]
Разберём изменения:
ARG MESSAGE="Hello, Docker!": Эта инструкция определяет аргумент сборкиMESSAGEсо значением по умолчанию "Hello, Docker!". Это значение можно переопределить во время сборки.LABEL maintainer="Your Name <your.email@example.com>": Добавляет метку к образу. Метки полезны для хранения информации, например, об авторе, версии или других метаданных.CMD ["cowsay", "$MESSAGE"]: Мы изменили инструкциюCMD, чтобы она использовала значение аргументаMESSAGE.
Сохраните изменения в Dockerfile, нажав Ctrl + X, затем Y и Enter.
Теперь соберём образ снова, но на этот раз передадим значение аргумента MESSAGE через флаг --build-arg. Также присвоим образу новый тег my-custom-cowsay-image.
docker build --build-arg MESSAGE="Building with arguments!" -t my-custom-cowsay-image .
Обратите внимание на вывод во время сборки. Вы должны увидеть обработку инструкции ARG с установкой значения MESSAGE в "Building with arguments!".
После завершения сборки запустим контейнер из нового образа:
docker run my-custom-cowsay-image
Теперь контейнер должен вывести кастомное сообщение "Building with arguments!".
Вы также можете проверить метки образа с помощью команды docker inspect:
docker inspect my-custom-cowsay-image
В выводе найдите секцию "Labels". Вы увидите метку maintainer с указанным в Dockerfile значением.
Сборка образа для конкретной платформы с сохранением в файл
На этом шаге вы научитесь собирать Docker-образ для определённой платформы и сохранять собранный образ в файл. Сборка для разных платформ полезна, когда вам нужно развернуть приложение на системах с различными архитектурами (например, ARM и x86). Сохранение в файл позволяет создать tar-архив образа, который можно легко переносить и загружать в другое окружение Docker.
Сначала убедитесь, что находитесь в директории ~/project:
cd ~/project
Мы будем использовать тот же Dockerfile из предыдущего шага. Вы можете просмотреть его содержимое командой cat:
cat Dockerfile
Вывод должен быть следующим:
FROM ubuntu:latest
ARG MESSAGE="Hello, Docker!"
RUN apt-get update && apt-get install -y cowsay
LABEL maintainer="Your Name <your.email@example.com>"
CMD ["cowsay", "$MESSAGE"]
Теперь соберём образ специально для платформы linux/arm64. Мы используем флаг --platform. Обратите внимание, что сборка для другой платформы требует Docker Buildx, который обычно включён в последние версии Docker.
docker build --platform linux/arm64 -t my-arm64-cowsay-image .
Эта команда соберёт образ для архитектуры ARM64. Вы увидите вывод, аналогичный предыдущим сборкам, но процесс будет ориентирован на другую архитектуру.
После завершения сборки вы можете вывести список образов и увидеть новый образ. Обратите внимание, что в колонке ARCHITECTURE для этого образа будет указано arm64.
docker images
Теперь сохраним этот образ в tar-файл. Это полезно для сохранения и обмена образами без использования реестра. Мы используем флаг --output с опцией type=tar.
docker build --platform linux/arm64 -t my-arm64-cowsay-image . --output type=tar,dest=my-arm64-cowsay-image.tar
Эта команда снова соберёт образ (возможно, используя кеш сборки) и сохранит его как tar-файл с именем my-arm64-cowsay-image.tar в директории ~/project.
Вы можете проверить создание tar-файла командой ls:
ls -lh my-arm64-cowsay-image.tar
Вы увидите файл с указанием его размера. Этот tar-файл содержит все слои образа my-arm64-cowsay-image. Вы можете перенести этот файл на другую машину и загрузить его командой docker load -i my-arm64-cowsay-image.tar.
Сборка образа с управлением кешированием и защитой секретов
На этом шаге вы узнаете об управлении кешем Docker при сборке и о безопасной работе с секретами с использованием типа монтирования secret в BuildKit. Кеш сборки может значительно ускорить процесс, но иногда его необходимо отключать. Безопасная обработка секретов критически важна, чтобы избежать попадания конфиденциальной информации в слои образа.
Сначала убедитесь, что находитесь в директории ~/project:
cd ~/project
Модифицируем Dockerfile, добавив шаг для демонстрации управления кешем и работы с секретами. Мы добавим команду создания файла с временной меткой и шаблон для использования секрета.
Откройте Dockerfile для редактирования:
nano Dockerfile
Добавьте команду RUN, создающую файл с временной меткой, и закомментированный пример использования секрета:
FROM ubuntu:latest
ARG MESSAGE="Hello, Docker!"
RUN apt-get update && apt-get install -y cowsay
LABEL maintainer="Your Name <your.email@example.com>"
RUN echo "Build time: $(date)" > /app/build_info.txt
## Это шаблон для команды, использующей секрет
## RUN --mount=type=secret,id=mysecret cat /run/secrets/mysecret > /app/secret_info.txt
CMD ["cowsay", "$MESSAGE"]
Мы добавили RUN echo "Build time: $(date)" > /app/build_info.txt. Эта команда создаёт файл /app/build_info.txt с временной меткой сборки. По умолчанию Docker кеширует слои. Если собирать образ несколько раз без изменения предыдущих инструкций, этот слой может быть взят из кеша, и временная метка не обновится.
Сохраните изменения в Dockerfile, нажав Ctrl + X, затем Y и Enter.
Теперь соберём образ с новым тегом my-cached-image:
docker build -t my-cached-image .
Обратите внимание на вывод. Если образ собирался недавно, некоторые шаги могут быть помечены как ---> Using cache.
Для демонстрации управления кешем соберём образ снова, но с отключённым кешем с помощью флага --no-cache:
docker build --no-cache -t my-no-cache-image .
Вы увидите, что Docker пересобирает все слои, даже если инструкции не изменились. Это полезно, когда нужно гарантировать свежесть зависимостей или если предыдущая сборка повредила кеш.
Теперь рассмотрим работу с секретами. Закомментированная строка ## RUN --mount=type=secret,id=mysecret cat /run/secrets/mysecret > /app/secret_info.txt демонстрирует использование секретов в BuildKit. Для этого нужно активировать BuildKit (обычно включён по умолчанию в новых версиях Docker) и передать секрет через флаг --secret.
Например, если у вас есть файл mysecret.txt с секретом, сборка выглядела бы так (команда не сработает, так как файла нет и строка закомментирована, но показывает синтаксис):
## docker build --secret id=mysecret,src=mysecret.txt -t my-secret-image .
Инструкция RUN --mount=type=secret,id=mysecret делает содержимое секрета доступным по пути /run/secrets/mysecret только во время сборки. Секрет не попадает в финальные слои образа. Это безопасный способ работы с конфиденциальными данными (API-ключами, паролями) при сборке.
Поскольку у нас нет файла с секретом и строка закомментирована, мы не будем выполнять сборку с секретами. Однако понимание работы --no-cache и типа монтирования secret важно для контроля сборки и защиты данных.
Резюме
В этой лабораторной работе вы изучили основы создания Docker-образов с использованием Dockerfile. Вы начали с создания простого Dockerfile на основе Ubuntu, установки пакета и определения команды по умолчанию. Это познакомило вас с основными инструкциями FROM, RUN и CMD, а также с процессом сборки образа с помощью docker build и тегированием.
Развивая базовые знания, вы освоили более продвинутые техники сборки образов. Вы научились использовать аргументы сборки (build arguments) и метки (labels) в Dockerfile для настройки процесса сборки и добавления метаданных к образу. Также вы попрактиковались в сборке образов для конкретных платформ и сохранении результата в файл, что продемонстрировало контроль над выводом сборки. Наконец, вы изучили управление кешем сборки и безопасную обработку секретов во время сборки, ознакомившись с лучшими практиками эффективного и безопасного создания образов.



