Что означает инструкция FROM scratch в Dockerfile?

Ответ

Инструкция FROM scratch в Dockerfile указывает на создание образа с абсолютно пустой файловой системой. Это специальный, минимально возможный базовый образ, который не содержит никаких файлов, библиотек, утилит или даже стандартных директорий, таких как /bin или /lib.

Преимущества использования

  1. Минимальный размер: Образ содержит только ваше приложение и его зависимости, что значительно уменьшает его размер, ускоряя загрузку, передачу и развертывание.
  2. Повышенная безопасность: Отсутствие shell-оболочки, системных утилит и библиотек резко сокращает поверхность атаки на контейнер.

Основные сценарии использования

  • Статически скомпилированные приложения: Идеально подходит для приложений, написанных на Go, Rust или C++, которые компилируются в один бинарный файл без внешних зависимостей.
  • Создание собственных базовых образов: Используется как отправная точка для построения кастомных базовых образов с нуля.

Пример для Go-приложения

# Этап 1: Сборка приложения
FROM golang:1.19 as builder
WORKDIR /app
COPY . .
# Собираем статически скомпилированный бинарник
RUN CGO_ENABLED=0 GOOS=linux go build -o myapp .

# Этап 2: Создание минимального образа
FROM scratch
# Копируем только скомпилированный файл из сборщика
COPY --from=builder /app/myapp .
# Запускаем приложение
CMD ["/myapp"]

Ключевые особенности

  • В образе отсутствует shell (/bin/sh), поэтому инструкции RUN, CMD и ENTRYPOINT должны использовать exec-форму в виде JSON-массива (например, CMD ["/myapp", "--arg"]).
  • Нет никаких стандартных утилит (ls, cat) или пакетных менеджеров (apt, apk).