← Назад к вопросам

Что такое FROM в Dockerfile?

1.0 Junior🔥 212 комментариев
#Docker и контейнеризация

Комментарии (2)

🐱
deepseek-v3.2PrepBro AI5 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Что такое директива FROM в Dockerfile?

Директива FROM — это фундаментальная и обязательная инструкция в любом Dockerfile, которая определяет базовый образ (base image), используемый для создания нового Docker-образа. Её можно считать точкой отсчёта или "фундаментом", на котором строятся все последующие слои контейнера.

Основное назначение и принцип работы

  • Определение базового слоя: Инструкция FROM всегда должна быть первой значимой инструкцией в Dockerfile (после возможных комментариев и инструкций ARG, которые используются до FROM). Она указывает Docker, с какого существующего образа начать сборку.
  • Принцип наследования: Ваш новый образ "наследует" всё содержимое базового: файловую систему, установленные пакеты, переменные окружения и конфигурацию. Все последующие инструкции (RUN, COPY, CMD и т.д.) применяются поверх этого базового слоя.
  • Использование слоёв (Layers): Docker использует архитектуру, основанную на слоях. Образ, указанный в FROM, становится первым (нижним) неизменяемым слоем вашего нового образа. Каждая следующая инструкция в Dockerfile создаёт новый слой поверх предыдущих.

Синтаксис и варианты использования

Базовый синтаксис директивы:

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

1. Указание образа и тега (tag)

  • <image>: Имя базового образа. Это может быть образ из официального реестра Docker Hub (ubuntu, nginx, python), образ из стороннего реестра (gcr.io/google-samples/hello-app), или локальный образ.
  • <tag>: Опциональный тег, определяющий конкретную версию образа. Крайне рекомендуется всегда указывать явный тег для обеспечения воспроизводимости сборок. Использование latest в production-среде считается плохой практикой.

Примеры:

# Использование официального образа Ubuntu 22.04
FROM ubuntu:22.04

# Использование конкретной версии Alpine Linux (очень популярен из-за малого размера)
FROM alpine:3.18

# Использование официального образа Python с конкретной версией
FROM python:3.11-slim-bookworm

# Образ из стороннего реестра
FROM amazoncorretto:17-alpine-jdk

2. Указание диджеста (digest)

Для максимальной детерминированности и безопасности можно использовать криптографический хеш (digest). Это гарантирует, что будет использован точно тот же бинарный образ.

FROM ubuntu@sha256:abc123def456...

3. Многоэтапные сборки (Multi-stage builds)

Директива FROM может использоваться в Dockerfile несколько раз. Это ключевая возможность для многоэтапных сборок, которая позволяет:

  • Использовать разные базовые образы для разных этапов.
  • Резко уменьшить итоговый размер финального образа, копируя только артефакты (например, скомпилированные бинарные файлы) из одного этапа ("строительного") в другой ("финальный").

Пример многоэтапной сборки для Go-приложения:

# Этап 1: Сборка (используем полный образ с Go и компилятором)
FROM golang:1.21 AS builder
WORKDIR /app
COPY . .
RUN go build -o myapp .

# Этап 2: Финальный образ (используем минимальный образ, куда копируем только бинарник)
FROM alpine:latest
WORKDIR /root/
COPY --from=builder /app/myapp .
CMD ["./myapp"]

В этом примере финальный образ не содержит ни компилятора Go, ни исходного кода — только легковесный Alpine Linux и готовый бинарник, что делает образ безопаснее и меньше.

4. Именование этапов (AS <name>)

При многоэтапной сборке этапам можно давать имена с помощью ключевого слова AS. Это позволяет легко ссылаться на них на последующих этапах (как показано в примере выше: COPY --from=builder).

Рекомендации по выбору базового образа

  1. Официальные образы: Предпочитайте официальные образы (Official Images) из Docker Hub. Они хорошо поддерживаются, безопасны и следуют best practices.
  2. Минимализм: Выбирайте минималистичные варианты (-alpine, -slim, -buster-slim), если вам не нужен полный дистрибутив. Это ускоряет скачивание, развёртывание и уменьшает поверхность для атак.
  3. Конкретные теги: Избегайте плавающего тега latest в production. Фиксируйте версию (python:3.11.4-slim) или, как минимум, мажорную версию (node:18).
  4. Актуальность и безопасность: Регулярно обновляйте базовые образы в своих Dockerfile, чтобы получать исправления уязвимостей и обновления ПО.

Заключение

Директива FROM — это не просто техническое требование синтаксиса Dockerfile. Это стратегический выбор, который влияет на безопасность, размер, производительность и стабильность ваших контейнеров. Грамотный подбор базового образа, использование многоэтапных сборок и фиксация версий являются неотъемлемой частью профессиональной практики DevOps-инженера и напрямую способствуют созданию эффективной и надёжной контейнерной инфраструктуры.

Что такое FROM в Dockerfile? | PrepBro