Без какой инструкции не может существовать докер файл
Докерфайл (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
-
Это используется, например, для создания минимальных контейнеров на Go или C, когда вручную добавляются только нужные бинарники.
-
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 <container_id> myimage
Но это обходит Dockerfile и не относится к его синтаксису.
Таким образом, инструкция FROM — это краеугольный камень Dockerfile, без которого не может начаться построение образа.