Из каких основных инструкций состоит Dockerfile?

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

Ответ

Dockerfile — это набор инструкций для сборки Docker-образа. Основные директивы, которые я использую:

  1. FROM: Определяет базовый образ. Всегда стараюсь использовать конкретные теги, а не latest.
    FROM alpine:3.18
  2. WORKDIR: Устанавливает рабочую директорию для всех последующих инструкций (RUN, COPY, CMD).
  3. COPY (предпочтительнее ADD): Копирует файлы и директории из контекста сборки в образ.
    COPY package*.json ./  # Копируем зависимости
    COPY src/ ./src/       # Копируем исходный код
  4. RUN: Выполняет команды в слое образа (установка пакетов, компиляция). Для уменьшения размера образа объединяю команды и чищу кэш.
    RUN apk add --no-cache nodejs npm 
        && npm ci --only=production 
        && apk del npm
  5. ENV: Устанавливает переменные окружения, которые будут доступны в контейнере.
  6. EXPOSE: Документирует порт, который прослушивает приложение (фактическое пробрасывание делается через docker run -p).
  7. USER: Меняет пользователя на непривилегированного для повышения безопасности.
  8. CMD или ENTRYPOINT: Определяет команду по умолчанию для запуска контейнера. Использую exec-форму.
    CMD ["node", "src/app.js"]

Best practice: Строю Dockerfile так, чтобы часто меняющиеся слои (код приложения) были в конце, а редко меняющиеся (установка зависимостей) — в начале. Это ускоряет сборку за счет кэширования слоев.