С какой инструкции должен начинаться Dockerfile?

«С какой инструкции должен начинаться Dockerfile?» — вопрос из категории Docker, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Обязательной и первой значимой инструкцией в Dockerfile является FROM. Она определяет базовый образ, от которого будет наследоваться собираемый образ. Без FROM сборка невозможна.

Синтаксис:

FROM <image>[:<tag>] [AS <name>]

Примеры:

# Использование официального образа с конкретным тегом (рекомендуется)
FROM ubuntu:22.04

# Использование образа для многоэтапной сборки
FROM golang:1.21-alpine AS builder

# Использование минимального образа для финального контейнера
FROM alpine:latest

Ключевые моменты:

  • Тег (:tag): Всегда явно указывайте тег (например, ubuntu:22.04, nginx:1.25-alpine), а не полагайтесь на latest. Это обеспечивает воспроизводимость сборок и предотвращает неожиданные изменения при обновлении latest.
  • Многоэтапные сборки: Инструкция ARG может быть объявлена до первого FROM для использования в нем, но сам процесс сборки начинается с первого FROM. Последующие этапы сборки используют новые инструкции FROM.
  • Выбор базового образа: Выбор влияет на размер, безопасность и состав финального образа. Для production-контейнеров предпочитаю минимальные образы на основе alpine или distroless.

Плохая практика: FROM ubuntu (неявный latest). Хорошая практика: FROM ubuntu:22.04 (явная версия).