Найти в Дзене
bashninja | DevOps & SRE ⚙️

⚡️ S02E02 — Свой первый Dockerfile: образы, кэш и размер без боли

⚡️ S02E02 — Свой первый Dockerfile: образы, кэш и размер без боли ━━━━━━━━━━━━━━━━━━ Привет, родные 👋 ━━━━━━━━━━━━━━━━━━ Сегодня собираем свой образ. По-честному: что такое Dockerfile, как работает кэш слоёв, почему образы «толстеют», и как сделать аккуратно и быстро. ━━━━━━━━━━━ 🎯 Что разберём (ровно по заданию) ━━━━━━━━━━━ — Базовые инструкции Dockerfile: FROM, WORKDIR, COPY, RUN, ENV, EXPOSE. — Кэш слоёв: почему порядок инструкций важен и как ускорять сборку. — .dockerignore: убираем лишние файлы из контекста. — Уменьшаем размер образа через multi-stage. — Частые грабли: «не виден файл», «команда не находится», «локально ок — в контейнере нет», «порт занят». — Мини-чек-лист качества: кэш, размер, не-root пользователь, логи и порты. ━━━━━━━━━━━ 📦 Скелет Dockerfile (что должно быть всегда) ━━━━━━━━━━━ FROM <база>:<тег> WORKDIR /app Сначала манифесты зависимостей → RUN установка Потом код → COPY . . Не-root пользователь EXPOSE нужного порта Понятная команда запуска (CMD) ━━━━━━━

⚡️ S02E02 — Свой первый Dockerfile: образы, кэш и размер без боли

━━━━━━━━━━━━━━━━━━

Привет, родные 👋

━━━━━━━━━━━━━━━━━━

Сегодня собираем свой образ. По-честному: что такое Dockerfile, как работает кэш слоёв, почему образы «толстеют», и как сделать аккуратно и быстро.

━━━━━━━━━━━

🎯 Что разберём (ровно по заданию)

━━━━━━━━━━━

— Базовые инструкции Dockerfile: FROM, WORKDIR, COPY, RUN, ENV, EXPOSE.

— Кэш слоёв: почему порядок инструкций важен и как ускорять сборку.

— .dockerignore: убираем лишние файлы из контекста.

— Уменьшаем размер образа через multi-stage.

— Частые грабли: «не виден файл», «команда не находится», «локально ок — в контейнере нет», «порт занят».

— Мини-чек-лист качества: кэш, размер, не-root пользователь, логи и порты.

━━━━━━━━━━━

📦 Скелет Dockerfile (что должно быть всегда)

━━━━━━━━━━━

FROM <база>:<тег>

WORKDIR /app

Сначала манифесты зависимостей → RUN установка

Потом код → COPY . .

Не-root пользователь

EXPOSE нужного порта

Понятная команда запуска (CMD)

━━━━━━━━━━━

🚀 Пайплайн «быстро и чинно»

━━━━━━━━━━━

Сначала зависимости (кэшируем), потом код. При мелких правках кода сборка летит за счёт сохранённого кэша.

━━━━━━━━━━━

🧪 Multi-stage: «толстый билд, тонкий рантайм»

━━━━━━━━━━━

Builder со всем для сборки → Runtime только с тем, что нужно для запуска.

Размер меньше, старт быстрее, поверхность атаки скромнее.

━━━━━━━━━━━

🛑 Типовые «почему не работает»

━━━━━━━━━━━

— COPY не находит файл → путь считается от контекста сборки.

— Команда не находится → поставили её в builder, а запускаете в runtime.

— Сервис молчит → слушает 127.0.0.1 вместо 0.0.0.0, порт/EXPOSE не совпадают.

— Образ раздулся → нет .dockerignore, тянете лишнее; помогает multi-stage.

— «Permission denied» к Docker → добавь себя в группу docker и перезайди.

— Порт занят → проверь ss -tulnp | grep :8080 или возьми другой порт.

━━━━━━━━━━━

🏁 Что делаем в серии

━━━━━━━━━━━

— Пишем простой Dockerfile под веб-сервис.

— Меряем время сборки до/после перестановки инструкций.

— Сжимаем образ multi-stage подходом.

— Ловим типовые ошибки и чиним их.

━━━━━━━━━━━━━━━━━━

🔗 Домашка, команды и мини-челленджи (lab06):

https://github.com/b4shninja/b4shninja/blob/main/courses/from_zero_to_devops_hero/lab06/README.md

━━━━━━━━━━━━━━━━━━

ИТОГ

━━━━━━━━━━━━━━━━━━

— Понимаешь логику слоёв и кэша.

— Собираешь образ аккуратно и без лишних мегабайт.

— Готов к следующей серии — тома и персистентность.