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

Ответ

Инструкция 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.

Ответ 18+ 🔞

Давай разберемся, как эта штука работает, а то тут один нюанс, который всех накрывает медным тазом.

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

Зачем она нужна, эта FROM? Представь, что ты строишь дом. Так вот, FROM — это фундамент, готовый участок с черновой отделкой. Это базовый образ, типа ubuntu:latest или python:3.9-slim. От него ты и пляшешь, добавляя свои слои: ставишь софт (RUN), копируешь файлы (COPY), настраиваешь команду запуска (CMD).

Вот тебе пример, до безобразия простой, но рабочий:

# Вот она, мать её, обязательная инструкция. Без неё — пиздец.
FROM alpine:latest

# А это уже по желанию. Хочешь — добавь, не хочешь — и так сойдёт.
CMD ["echo", "Привет из контейнера, чувак!"]

Почему без FROM — никуда? Потому что Docker — слоёный пирог, а без первого коржа — это просто крема на столе. FROM говорит системе: «Начинай складывать слои поверх этого образа». Нет отправной точки — не из чего строить. Попробуй собрать файл без FROM, получишь ошибку, от которой волосы дыбом встанут: invalid reference format. Сам от себя охуеешь.

А есть подвох? Есть, хитрая жопа! Перед FROM можно впихнуть инструкцию ARG. Это как динамит под фундамент — позволяет менять базовый образ на лету, прямо при сборке. Удобная штука, если не знаешь заранее, на чём будешь базироваться.

# Объявляем переменную ДО того, как начнём строить.
ARG BASE_IMAGE=ubuntu:22.04
# А теперь подставляем её в наш обязательный фундамент.
FROM ${BASE_IMAGE}

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

Остальные инструкции — по желанию. Ну серьёзно, они важные, но не обязательные:

  • RUN — чтобы что-то сделать внутри (установить, скомпилировать).
  • COPY / ADD — чтобы засунуть свои файлы в образ.
  • CMD / ENTRYPOINT — чтобы контейнер знал, что делать при старте.
  • WORKDIR — чтобы не путаться в директориях.
  • EXPOSE — для красоты, чтобы все знали, какой порт слушаем.

Короче, запомни раз и навсегда: FROM — это альфа и омега Dockerfile. Без неё — никуда, как без головы. Всё остальное — уже опциональные примочки.