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

Ответ

Строго обязательной является только одна инструкция: FROM. Она определяет базовый образ, от которого начинается сборка.

Однако, чтобы контейнер выполнял полезную работу, почти всегда требуются еще две ключевые инструкции:

  1. FROM <image>[:<tag>] — задает начальный слой образа. Без неё сборка невозможна.

    FROM ubuntu:22.04
    FROM python:3.11-slim
    FROM alpine:latest
  2. RUN <command> — выполняет команды в процессе сборки для установки пакетов, настройки среды и т.д.

    RUN apt-get update && apt-get install -y curl nginx
    RUN pip install --no-cache-dir -r requirements.txt
  3. CMD или ENTRYPOINT (или их комбинация) — определяет команду, которая будет выполняться при запуске контейнера. Без них контейнер запустится с командой по умолчанию от базового образа и сразу завершится.

    CMD ["nginx", "-g", "daemon off;"]
    ENTRYPOINT ["/app/start.sh"]

Минимальный рабочий Dockerfile:

FROM alpine:latest
RUN echo 'Hello from build time' > /tmp/build.log
CMD ["cat", "/tmp/build.log"]

Другие инструкции (COPY, WORKDIR, EXPOSE, ENV, USER) не являются обязательными, но критически важны для создания эффективных, безопасных и поддерживаемых образов.

Ответ 18+ 🔞

А, слушай, про Dockerfile? Ну, тут всё просто, как три копейки. Главное, что тебе надо запомнить — FROM это святое, без неё нихуя не соберёшь. Это как фундамент, ёпта. Без базового образа ты просто в воздухе строишь.

Но если ты хочешь, чтобы твой контейнер не просто собрался, а ещё и хоть что-то делал, то без двух других ребят тебе тоже каюк.

  1. FROM <образ>[:<тег>] — это начало начал. Без этой строчки ты можешь сразу идти на хуй, потому что собирать не из чего.

    FROM ubuntu:22.04
    FROM python:3.11-slim
    FROM alpine:latest
  2. RUN <команда> — вот это уже рабочий инструмент. Пока образ собирается, эта инструкция делает всю грязную работу: ставит пакеты, ковыряется в настройках, создаёт файлы. Без неё твой образ — просто голая болванка.

    RUN apt-get update && apt-get install -y curl nginx
    RUN pip install --no-cache-dir -r requirements.txt
  3. CMD или ENTRYPOINT (а можно и оба) — это, блядь, самое важное для запуска. Без них твой контейнер стартанёт, посмотрит по сторонам, скажет "чё делать-то?" и накроется медным тазом, потому что дефолтная команда базового образа может быть вообще никакой.

    CMD ["nginx", "-g", "daemon off;"]
    ENTRYPOINT ["/app/start.sh"]

Вот тебе минимальный, но боевой Dockerfile, чтоб понятно было:

FROM alpine:latest
RUN echo 'Hello from build time' > /tmp/build.log
CMD ["cat", "/tmp/build.log"]

Остальные инструкции (COPY, WORKDIR и прочие) — это уже опциональный кайф. Без них жить можно, но с ними образ получается аккуратнее, безопаснее и не такой распиздяйский. Но для старта хватит и трёх китов, которые я перечислил. Главное — начать, а там уже разберёшься.