В чем разница между инструкциями ENV и COPY в Dockerfile?

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

Ответ

ENV и COPY — фундаментально разные инструкции Dockerfile, используемые на разных этапах жизненного цикла образа.

ENV (Environment Variable) устанавливает переменные окружения внутри образа. Эти переменные:

  • Доступны на этапе сборки (в последующих инструкциях RUN).
  • Сохраняются в итоговом образе и доступны во время выполнения контейнера.
  • Часто используются для конфигурации приложения (пути, версии, флаги).
# Установка переменной на этапе сборки
ENV NODE_ENV=production 
    APP_PORT=8080

# Использование в RUN
RUN echo "Building for $NODE_ENV" && npm run build:$NODE_ENV

COPY копирует файлы и директории с хоста (контекста сборки) в файловую систему образа. Эта инструкция:

  • Выполняется только на этапе сборки.
  • Не влияет на окружение, а изменяет содержимое образа.
  • Критически важна для добавления исходного кода, конфигурационных файлов и статических ресурсов.
# Копирование зависимостей и исходного кода
COPY package*.json ./        # Копирует файлы package.json и package-lock.json
RUN npm ci                   # Устанавливает зависимости
COPY ./src ./src             # Копирует исходный код
COPY ./config ./config       # Копирует конфиги

Практическое различие: ENV APP_HOME=/app задает путь как переменную, а COPY . $APP_HOME использует эту переменную для копирования файлов в указанное место внутри образа. Переменные, заданные через ENV, можно переопределить при запуске контейнера (docker run -e "NODE_ENV=development"), в то время как файлы, добавленные через COPY, фиксированы в образе.