← Назад к вопросам

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

1.0 Junior🔥 132 комментариев
#MLOps и инфраструктура

Комментарии (2)

🐱
claude-haiku-4.5PrepBro AI29 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

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

Прямой ответ

Никакая инструкция не является формально обязательной для Dockerfile. Однако, в практике существует несколько инструкций, которые либо почти всегда используются, либо имеют критическое значение в зависимости от контекста.

Основные инструкции Dockerfile

1. FROM — Базовый образ (почти всегда обязательна)

Это обычно первая инструкция в Dockerfile. Она определяет базовый образ, на котором будет построен наш образ:

FROM python:3.11-slim

Без FROM образ не будет построен. Единственное исключение — использование FROM scratch для создания образа с нуля (редко).

2. RUN — Выполнение команд

Выполняет команды во время сборки образа:

RUN apt-get update && apt-get install -y curl
RUN pip install numpy pandas scikit-learn

3. COPY / ADD — Копирование файлов

Копирует файлы с хоста в образ:

COPY requirements.txt .
COPY . /app

4. WORKDIR — Рабочая директория

Устанавливает рабочую директорию:

WORKDIR /app

5. EXPOSE — Открытие портов

Объявляет, какие порты прослушивает контейнер:

EXPOSE 8000 5432

6. ENV — Переменные окружения

Устанавливает переменные окружения:

ENV PYTHONUNBUFFERED=1
ENV DATABASE_URL=postgresql://localhost/db

7. ENTRYPOINT / CMD — Команда при запуске

Определяет, что выполнять при старте контейнера:

# CMD (можно переопределить)
CMD ["python", "main.py"]

# или

# ENTRYPOINT (сложнее переопределить)
ENTRYPOINT ["python", "main.py"]

Полный пример Dockerfile

# Базовый образ (почти обязательно)
FROM python:3.11-slim

# Установка переменных окружения
ENV PYTHONUNBUFFERED=1 \
    PIP_NO_CACHE_DIR=1 \
    PYTHONDONTWRITEBYTECODE=1

# Рабочая директория
WORKDIR /app

# Установка системных зависимостей
RUN apt-get update && apt-get install -y \
    build-essential \
    curl \
    && rm -rf /var/lib/apt/lists/*

# Копирование файлов
COPY requirements.txt .
RUN pip install -r requirements.txt

# Копирование кода приложения
COPY . .

# Открытие портов
EXPOSE 8000

# Команда при запуске
CMD ["python", "main.py"]

Сравнение: CMD vs ENTRYPOINT

# Вариант 1: CMD
CMD ["python", "main.py"]
# docker run myimage                    → python main.py
# docker run myimage python script.py   → python script.py (переопределено)

# Вариант 2: ENTRYPOINT
ENTRYPOINT ["python", "main.py"]
# docker run myimage                    → python main.py
# docker run myimage arg1 arg2          → python main.py arg1 arg2 (аргументы добавляются)

# Вариант 3: ENTRYPOINT + CMD (лучшая практика)
ENTRYPOINT ["python"]
CMD ["main.py"]
# docker run myimage                    → python main.py
# docker run myimage script.py          → python script.py

Что обязательно для разных типов приложений

Data Science приложение (ML модель):

FROM python:3.11

WORKDIR /app

COPY requirements.txt .
RUN pip install -r requirements.txt

COPY . .

EXPOSE 5000

CMD ["python", "app.py"]

FastAPI приложение:

FROM python:3.11-slim

WORKDIR /app

COPY requirements.txt .
RUN pip install -r requirements.txt

COPY . .

EXPOSE 8000

CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]

PostgreSQL приложение:

FROM postgres:15

ENV POSTGRES_USER=user \
    POSTGRES_PASSWORD=password \
    POSTGRES_DB=database

COPY init.sql /docker-entrypoint-initdb.d/

Инструкции и их роль

ИнструкцияОбязательна?РольПример
FROMПочти всегдаБазовый образFROM ubuntu:22.04
RUNЧастоУстановка пакетовRUN apt-get install git
COPY/ADDЧастоКопирование файловCOPY . /app
WORKDIRЧастоРабочая директорияWORKDIR /app
CMDОбычноКоманда по умолчаниюCMD ["python", "app.py"]
ENTRYPOINTРедкоТочка входаENTRYPOINT ["python"]
EXPOSEОпциональноДокументация портовEXPOSE 8000
ENVОпциональноПеременные окруженияENV DEBUG=false
LABELОпциональноМетаданныеLABEL version="1.0"
VOLUMEОпциональноМонтажные точкиVOLUME /data
USERОпциональноПользователь контейнераUSER appuser

Минимальный валидный Dockerfile

FROM scratch
COPY myapp /
ENTRYPOINT ["/myapp"]

Это самый минимальный Dockerfile, который:

  • Начинается с FROM (хотя и FROM scratch)
  • Копирует скомпилированное бинарное приложение
  • Запускает его

Однако на практике это редко используется.

Best Practices

  1. Всегда начинайте с FROM — это базис контейнера

  2. Используйте конкретные версии образов — не latest:

    # Плохо
    FROM python:latest
    
    # Хорошо
    FROM python:3.11.7-slim
    
  3. Минимизируйте количество слоёв — используйте && для объединения команд:

    # Плохо (3 слоя)
    RUN apt-get update
    RUN apt-get install -y curl
    RUN rm -rf /var/lib/apt/lists/*
    
    # Хорошо (1 слой)
    RUN apt-get update && apt-get install -y curl && rm -rf /var/lib/apt/lists/*
    
  4. Используйте .dockerignore — исключайте лишние файлы

Заключение

Формально, нет абсолютно обязательных инструкций, однако на практике:

  • FROM — почти всегда нужна (это базис)
  • ENTRYPOINT или CMD — нужна для определения поведения контейнера
  • COPY / ADD — нужны если нужно добавить файлы
  • RUN — нужна для установки зависимостей

Минимальный рабочий Dockerfile должен содержать FROM и одну из (ENTRYPOINT/CMD).