Главная · Скиллы · multi-stage-dockerfile

multi-stage-dockerfileOfficialмногоэтапный Dockerfile GitHub Copilot

github/awesome-copilot

Многоэтапный Dockerfile.

Установка

npx -y skills add github/awesome-copilot --skill multi-stage-dockerfile --agent claude-code

Цель — помочь создавать эффективные многоэтапные Dockerfile по лучшим практикам, дающие меньшие и более безопасные образы контейнеров.

Многоэтапная структура

  • Используйте этап-сборщик (builder) для компиляции, установки зависимостей и других операций времени сборки
  • Используйте отдельный runtime-этап, включающий только необходимое для запуска приложения
  • Копируйте из builder в runtime только нужные артефакты
  • Давайте этапам осмысленные имена через AS (например, FROM node:18 AS builder)
  • Располагайте этапы логично: зависимости → сборка → тесты → runtime

Базовые образы

  • По возможности начинайте с официальных минимальных базовых образов
  • Указывайте точные теги версий для воспроизводимых сборок (например, python:3.11-slim, а не просто python)
  • Рассмотрите distroless-образы для runtime-этапов, где уместно
  • Используйте Alpine-образы для меньшего размера, когда совместимо с приложением
  • Обеспечьте в runtime-образе минимально необходимые зависимости

Оптимизация слоёв

  • Организуйте команды для максимального кеширования слоёв
  • Размещайте часто меняющиеся команды (изменения кода) после реже меняющихся (установка зависимостей)
  • Используйте .dockerignore, чтобы не включать лишние файлы в контекст сборки
  • Объединяйте связанные RUN-команды через &&, чтобы сократить число слоёв
  • Рассмотрите COPY --chown для установки прав в один шаг

Практики безопасности

  • Избегайте запуска контейнеров от root — используйте инструкцию USER для не-root пользователя
  • Удаляйте инструменты сборки и лишние пакеты из финального образа
  • Сканируйте финальный образ на уязвимости
  • Устанавливайте ограничительные права на файлы
  • Используйте многоэтапную сборку, чтобы не включать секреты сборки в финальный образ

Производительность

  • Используйте build-аргументы для конфигурации, меняющейся между окружениями
  • Эффективно используйте кеш сборки, упорядочивая слои от реже к чаще меняющимся
  • Рассмотрите распараллеливание шагов сборки, где возможно
  • Задавайте подходящие переменные окружения вроде NODE_ENV=production для оптимизации runtime
  • Используйте подходящие healthcheck для типа приложения через инструкцию HEALTHCHECK

Из того же репозитория