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

Ответ

Dockerfile — это текстовый документ, содержащий все команды, которые Docker Engine должен выполнить для сборки образа. Каждая инструкция создает новый слой в образе, что важно для оптимизации кэширования и размера образа.

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

  • FROM <image>[:<tag>]:

    • Назначение: Определяет базовый образ, на основе которого будет строиться ваш образ. Это обязательная и первая инструкция в любом Dockerfile.
    • Почему: Устанавливает начальное состояние образа, включая операционную систему и предустановленное ПО.
    • Пример: FROM python:3.9-slim-buster
  • RUN <command>:

    • Назначение: Выполняет команды в новой оболочке внутри образа во время его сборки.
    • Почему: Используется для установки пакетов, компиляции кода, создания директорий и других подготовительных шагов, необходимых для работы приложения.
    • Пример: RUN apt-get update && apt-get install -y build-essential
  • COPY <src> <dest>:

    • Назначение: Копирует файлы или директории с хост-машины (контекста сборки) в файловую систему образа.
    • Почему: Используется для добавления исходного кода, конфигурационных файлов и других ресурсов приложения в образ. Предпочтительнее ADD для простых копирований.
    • Пример: COPY ./app /app
  • WORKDIR <path>:

    • Назначение: Устанавливает рабочую директорию для всех последующих инструкций RUN, CMD, ENTRYPOINT, COPY, ADD.
    • Почему: Упрощает пути к файлам и командам, делая Dockerfile более читаемым и поддерживаемым.
    • Пример: WORKDIR /app
  • ENV <key>=<value>:

    • Назначение: Устанавливает переменные окружения, которые будут доступны внутри контейнера во время сборки и выполнения.
    • Почему: Используется для конфигурации приложения, например, для указания портов, баз данных или режимов работы.
    • Пример: ENV PORT=8000
  • EXPOSE <port> [<port>...]:

    • Назначение: Информирует Docker, что контейнер будет слушать на указанных сетевых портах во время выполнения.
    • Почему: Это документация для пользователя образа и не публикует порт автоматически. Для публикации порта используется флаг -p при запуске контейнера (docker run -p 8000:8000 ...).
    • Пример: EXPOSE 8000
  • CMD ["executable", "param1", "param2"] (exec form) или CMD command param1 param2 (shell form):

    • Назначение: Определяет команду по умолчанию, которая будет выполнена при запуске контейнера.
    • Почему: Если пользователь запускает контейнер без указания команды, будет выполнена CMD. В Dockerfile может быть только одна инструкция CMD. Если CMD указан вместе с ENTRYPOINT, он служит аргументами для ENTRYPOINT.
    • Пример: CMD ["python", "app.py"]
  • ENTRYPOINT ["executable", "param1", "param2"] (exec form) или ENTRYPOINT command param1 param2 (shell form):

    • Назначение: Настраивает контейнер как исполняемый файл.
    • Почему: Используется для создания исполняемых образов, где контейнер всегда выполняет одну и ту же команду, а CMD предоставляет аргументы по умолчанию для этой команды.
    • Пример: ENTRYPOINT ["gunicorn", "app:app", "--bind", "0.0.0.0:8000"]

Пример Dockerfile:

FROM python:3.9-slim-buster

WORKDIR /app

# Копируем файл зависимостей и устанавливаем их
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

# Копируем остальной код приложения
COPY . .

# Объявляем порт, на котором будет слушать приложение
EXPOSE 8000

# Команда для запуска приложения при старте контейнера
CMD ["python", "app.py"]