Сборка образа с управлением кешем и защитой секретов
На этом шаге вы узнаете об управлении кешем 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 <[email protected]>"
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
важно для контроля сборки и защиты данных.