Для чего нужна команда RUN в Dockerfile?

«Для чего нужна команда RUN в Dockerfile?» — вопрос из категории Docker, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Инструкция RUN выполняет команды в оболочке (например, /bin/sh) во время сборки образа Docker. Каждая инструкция RUN создаёт новый слой в итоговом образе. Это основной инструмент для настройки окружения внутри образа.

Типичные сценарии использования:

  1. Установка системных пакетов и зависимостей:

    RUN apt-get update && apt-get install -y 
        curl 
        git 
        nginx 
        && rm -rf /var/lib/apt/lists/*

    Объединение команд через && и очистка кэша в одном RUN уменьшает итоговый размер образа.

  2. Сборка приложений из исходного кода:

    RUN go build -o /app/main ./cmd/server
  3. Настройка прав доступа и создание служебных директорий:

    RUN groupadd -r appuser && useradd -r -g appuser appuser 
        && mkdir -p /app/data 
        && chown -R appuser:appuser /app

Лучшие практики, которым я следую:

  • Минимизация слоёв: Объединяю логически связанные команды в один RUN.
  • Кэширование: Docker кэширует результат каждого слоя RUN. Изменение команды в середине Dockerfile инвалидирует кэш для этого и всех последующих слоёв. Поэтому редко меняемые операции (установка пакетов) стоит располагать выше, а часто меняемые (копирование кода) — ниже.
  • Безопасность: Использую официальные базовые образы и проверенные репозитории для установки пакетов.