Какая инструкция является обязательной в Dockerfile?

«Какая инструкция является обязательной в Dockerfile?» — вопрос из категории DevOps, который задают на 26% собеседований Data Scientist / ML Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Инструкция FROM является единственной обязательной инструкцией в Dockerfile. Она должна быть первой значимой инструкцией (за исключением возможных инструкций ARG, предшествующих FROM для динамического указания базового образа).

Назначение FROM: Она задает базовый образ, от которого наследуется собираемый образ. Этот базовый образ содержит файловую систему (например, Ubuntu, Alpine Linux) и часто предустановленное ПО (например, python:3.9-slim).

Пример минимального валидного Dockerfile:

# Обязательная инструкция - указываем базовый образ
FROM alpine:latest

# Далее можно добавить другие инструкции (опционально)
CMD ["echo", "Hello from container"]

Почему FROM обязательна: Docker строит образы послойно. Инструкция FROM инициализирует новый этап сборки и устанавливает родительский образ, к слоям которого будут добавляться новые слои от последующих инструкций (RUN, COPY, ADD и т.д.). Без отправной точки сборка невозможна.

Особый случай ARG перед FROM: Инструкцию FROM можно параметризовать с помощью ARG, объявленного до нее. Это позволяет динамически выбирать базовый образ во время сборки.

# ARG объявлен ДО FROM
ARG BASE_IMAGE=ubuntu:22.04
# FROM использует этот ARG
FROM ${BASE_IMAGE}

RUN apt-get update && apt-get install -y python3

Другие ключевые, но не обязательные инструкции:

  • RUN: Выполняет команду в слое образа (установка пакетов, компиляция).
  • COPY / ADD: Копируют файлы из контекста сборки или из URL в образ.
  • CMD / ENTRYPOINT: Определяют команду по умолчанию для запускаемого контейнера.
  • WORKDIR: Устанавливает рабочую директорию.
  • EXPOSE: Документирует порт, который контейнер будет слушать.

Без FROM команда docker build завершится с ошибкой: [internal] load metadata for docker.io/library/:latest -> failed to solve: docker.io/library/:latest: invalid reference format.