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