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

Что такое RUN в Dockerfile?

1.0 Junior🔥 182 комментариев
#Docker и контейнеризация

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

🐱
deepseek-v3.2PrepBro AI5 апр. 2026 г.(ред.)

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

Что такое инструкция RUN в Dockerfile?

Инструкция RUN — это одна из ключевых команд в Dockerfile, используемая для выполнения произвольных команд внутри контейнера во время сборки образа (build time). Каждая инструкция RUN создаёт новый слой в файловой системе образа, фиксируя изменения, внесённые выполнением команды. Это фундаментальный механизм для настройки среды внутри контейнера.

Основная цель и время выполнения

Основная цель RUNмодификация образа: установка пакетов, настройка конфигурации, компиляция кода, создание пользователей или каталогов. Все команды выполняются в процессе сборки (docker build), а не при запуске контейнера (docker run). Это отличает RUN от инструкций CMD или ENTRYPOINT, которые задают команду для выполнения при старте контейнера.

Синтаксис и варианты записи

Инструкция RUN имеет две формы:

  1. Shell-форма (исполняется через оболочку, по умолчанию /bin/sh -c на Linux или cmd /S /C на Windows):
    RUN apt-get update && apt-get install -y nginx
    
    Эта форма позволяет использовать возможности shell, такие как подстановка переменных или пайпы (`|`).

  1. Exec-форма (исполняется напрямую, без оболочки):
    RUN ["/bin/bash", "-c", "echo 'Hello, exec form!'"]
    
    Эта форма полезна для избегания нежелательного поведения shell и корректной обработки аргументов. Каждый элемент массива — отдельный аргумент.

Практическое применение и ключевые аспекты

  • Создание слоёв и кеширование: Каждая инструкция RUN создаёт новый слой в образе Docker. Слои кешируются, что ускоряет последующие сборки. Однако слишком много слоёв может увеличить итоговый размер образа. Оптимальная практика — объединять логически связанные команды в одну инструкцию RUN, используя && и \ для переноса строк.
    **Пример оптимизации:**
```dockerfile
# Плохо: создаст два слоя, и второй слой может содержать ненужные кешированные индексы пакетов
RUN apt-get update
RUN apt-get install -y python3 python3-pip

# Хорошо: одна инструкция, один слой, кеш пакетов очищен для уменьшения размера образа
RUN apt-get update && \
    apt-get install -y --no-install-recommends python3 python3-pip && \
    rm -rf /var/lib/apt/lists/*
```
  • Контекст выполнения: Команды выполняются в текущем рабочем каталоге (если он не изменён инструкцией WORKDIR) и с привилегиями root по умолчанию (если не изменено инструкцией USER).

  • Использование аргументов сборки (ARG): Внутри инструкции RUN можно использовать переменные, определённые с помощью ARG. Они доступны только на этапе сборки.

    ARG APP_VERSION="latest"
    RUN echo "Сборка версии ${APP_VERSION}" && \
        wget https://example.com/app-${APP_VERSION}.tar.gz
    

Отличия от других инструкций Dockerfile

  • RUN vs CMD/ENTRYPOINT: RUN выполняется при сборке и изменяет образ. CMD и ENTRYPOINT определяют команду, которая будет запущена при старте контейнера на основе этого образа.
  • RUN vs COPY/ADD: RUN выполняет команды, в то время как COPY и ADD копируют файлы и каталоги из хост-системы или из сети в образ.

Пример Dockerfile с использованием RUN

# Используем базовый образ
FROM ubuntu:22.04

# Устанавливаем рабочую директорию
WORKDIR /app

# Обновляем индекс пакетов и устанавливаем необходимое ПО
# Одна инструкция RUN для эффективного кеширования и уменьшения размера
RUN apt-get update && \
    apt-get install -y --no-install-recommends \
        python3 \
        python3-pip \
        curl \
    && rm -rf /var/lib/apt/lists/*

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

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

# Инструкция для запуска при старте контейнера
CMD ["python3", "app.py"]

Итог: Инструкция RUN — это основной инструмент для преобразования базового образа в готовое к работе приложение или сервис. Грамотное её использование (объединение команд, очистка кешей) напрямую влияет на размер, безопасность и скорость сборки финальных Docker-образов.