Ответ
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, фиксированы в образе.