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

Без какой инструкции не запустится docker build

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

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

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

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

Ключевая инструкция Dockerfile: FROM

Без инструкции FROM команда docker build не запустится и завершится с ошибкой. Это первая и обязательная директива в любом Dockerfile (за исключением очень редких случаев с --platform флагом, но и там она косвенно присутствует). Инструкция FROM определяет базовый образ (base image), на основе которого будет строиться ваш контейнер. Docker-движку необходимо знать отправную точку для сборки.

Почему FROM обязательна?

  1. Создание контекста сборки: Инструкция FROM инициализирует новый этап сборки (build stage) и устанавливает начальное состояние файловой системы образа. Все последующие инструкции (RUN, COPY, ADD и т.д.) выполняются в контексте этого базового образа.
  2. Иерархия слоев (Layers): Образы в Docker построены по принципу наследования слоев. FROM указывает на родительский образ, слои которого будут использованы как read-only основа. Ваши изменения добавляются поверх них новыми слоями.
  3. Архитектурная зависимость: FROM также может указывать на архитектуру и вариант образа (например, linux/amd64, linux/arm64), что критично для кроссплатформенной сборки.

Пример и результат ошибки

Если попытаться собрать образ из Dockerfile без FROM:

Dockerfile (НЕРАБОЧИЙ):

# Отсутствует инструкция FROM
RUN apt-get update && apt-get install -y nginx
COPY index.html /usr/share/nginx/html/
CMD ["nginx", "-g", "daemon off;"]

Команда сборки и типичная ошибка:

docker build -t my-nginx .

Вывод ошибки будет примерно таким:

[+] Building 0.0s (0/0)
error: failed to solve: dockerfile parse error line 2: unknown instruction: RUN

Или более явное:

error: Dockerfile parse error: Dockerfile must begin with a FROM instruction

Исправленный рабочий пример

Корректный Dockerfile:

# Обязательная инструкция, задающая базовый образ
FROM ubuntu:22.04

# Все последующие инструкции выполняются в контексте образа ubuntu:22.04
RUN apt-get update && apt-get install -y nginx
COPY index.html /usr/share/nginx/html/
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]

Особые случаи и продвинутое использование

Хотя FROM обязательна, есть нюансы:

  • Многоэтапная сборка (Multi-stage build): В одном Dockerfile может быть несколько инструкций FROM, каждая из которых начинает новый этап сборки. Это позволяет отделить этап сборки артефактов (например, компиляции кода) от этапа формирования итогового легковесного образа.
    # Этап сборки (builder)
    FROM golang:1.21 AS builder
    WORKDIR /app
    COPY . .
    RUN go build -o myapp .
    
    # Финальный этап
    FROM alpine:latest
    COPY --from=builder /app/myapp /usr/local/bin/myapp
    CMD ["myapp"]
    
  • Базовый образ scratch: Это пустой образ, не содержащий файловой системы или менеджера пакетов. Используется для создания минималистичных образов, содержащих только ваше статически скомпилированное приложение.
    FROM scratch
    COPY hello /
    CMD ["/hello"]
    
  • Аргументы в FROM: Инструкция может использовать переменные, объявленные с помощью ARG, что позволяет динамически выбирать базовый образ.
    ARG BASE_IMAGE=ubuntu:22.04
    FROM ${BASE_IMAGE}
    ...
    

Вывод

Таким образом, FROM — это фундаментальная и безусловно обязательная инструкция для любого Dockerfile. Она задает отправную точку для процесса сборки, определяет наследуемые слои и окружение. Без нея сборщик Docker не имеет контекста для выполнения последующих команд. Все остальные инструкции (RUN, COPY, CMD, ENTRYPOINT, ENV и др.) являются опциональными с точки зрения синтаксиса, но именно FROM запускает весь процесс.