Ответ
Инструкция FROM scratch
в Dockerfile указывает на создание образа с абсолютно пустой файловой системой. Это специальный, минимально возможный базовый образ, который не содержит никаких файлов, библиотек, утилит или даже стандартных директорий, таких как /bin
или /lib
.
Преимущества использования
- Минимальный размер: Образ содержит только ваше приложение и его зависимости, что значительно уменьшает его размер, ускоряя загрузку, передачу и развертывание.
- Повышенная безопасность: Отсутствие 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
).