Без какой инструкции не может существовать докер файл


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

Среди всех доступных инструкций, без какой-либо одной из них Dockerfile не может существовать как рабочий — это инструкция FROM.

Инструкция FROM

FROM — обязательная инструкция в Dockerfile, которая указывает, от какого базового образа необходимо наследовать создаваемый образ.

📌 Примеры:

FROM ubuntu:22.04

FROM python:3.11-slim

FROM alpine

Эта инструкция обязательна и должна быть первой исполняемой в Dockerfile (если не считать опциональные ARG, определённые до неё).

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

Docker образы строятся на основе других образов. Даже если вы хотите создать "пустой" образ, вам всё равно нужно унаследоваться от чего-то. Обычно таким минимальным базовым образом является scratch — специальный пустой образ:

<br/>FROM scratch
  1. Это используется, например, для создания минимальных контейнеров на Go или C, когда вручную добавляются только нужные бинарники.

  2. Docker использует слоистую файловую систему. Каждый шаг в Dockerfile создает новый слой на основе предыдущего. Первый слой должен откуда-то начинаться — этим источником и является FROM.

🛠 Исключение: FROM в мультистейдж-сборке

Если вы используете мультистейдж-сборку, то у вас будет несколько инструкций FROM, каждая из которых начинает новый этап сборки.

Пример:

\# Этап сборки

FROM golang:1.21 as builder

WORKDIR /app

COPY . .

RUN go build -o app
\# Этап финального образа

FROM scratch

COPY --from=builder /app/app /app

ENTRYPOINT \["/app"\]

❗ Попытка создать Dockerfile без FROM приведёт к ошибке:

Если вы напишете Dockerfile без FROM и попытаетесь его собрать:

RUN echo "Hello"

То при сборке получите ошибку вида:

Error parsing Dockerfile: No base image specified

Это означает, что Docker не знает, на каком базовом образе строить слои, а следовательно, сборка невозможна.

Резюме самого правила:

  • Dockerfile не может быть собран без инструкции FROM.

  • Эта инструкция должна быть первой, если не считать глобальные ARG.

  • Даже если вы хотите создать абсолютно минимальный образ, вы должны использовать FROM scratch.

  • Все остальные инструкции (RUN, COPY, CMD, ENTRYPOINT, ENV, EXPOSE, и т.д.) необязательны и могут быть опущены — но FROM должна быть всегда.

🔧 Единственный способ не писать FROM — использовать docker commit

Можно создать образ вручную, например, так:

1. Запустить контейнер:

<br/>docker run -it ubuntu /bin/bash

2. Внести изменения.

3. Создать образ:

<br/>docker commit &lt;container_id&gt; myimage

Но это обходит Dockerfile и не относится к его синтаксису.

Таким образом, инструкция FROM — это краеугольный камень Dockerfile, без которого не может начаться построение образа.