🚀 13 Docker‑трюков, которые стоит знать каждому программисту

Docker Multi-stage builds

1. Multi-stage builds

Позволяет собирать образы в несколько этапов, оставляя в финальном образе только нужное:

FROM golang:1.22 AS builder
WORKDIR /app
COPY . .
RUN go build -o myapp .

FROM alpine:3.20
COPY —from=builder /app/myapp /usr/local/bin/
ENTRYPOINT [«myapp»]

🔹 Зачем: уменьшаем размер финального образа и избавляемся от лишнего ПО (компиляторов, зависимостей).
🔹 Когда: при сборке любого backend-приложения, особенно Go, Rust, Java.


2. Squash layers

Сжимает все слои в один, уменьшает вес:

export DOCKER_BUILDKIT=1
docker build —squash -t myapp:latest .

🔹 Зачем: компактные образы для продакшена.
🔹 Минус: ухудшает повторное использование кэша.


3. BuildKit Secrets

Встраиваем секреты во время сборки:

docker build —secret id=token,src=$HOME/.ssh/id_rsa .
dockerfileКопироватьРедактировать# syntax=docker/dockerfile:1.5RUN —mount=type=secret,id=token git clone git@github.com:private/repo.git

🔹 Зачем: безопасно использовать ключи в Dockerfile.
🔹 Когда: доступ к приватным репозиториям или API.


4. .dockerignore

Файл, исключающий лишние файлы из контекста:

.git
node_modules
*.md
tests/

🔹 Зачем: быстрее сборка, меньше риск утечки чувствительных данных.
🔹 Когда: всегда! Особенно если у вас много локальных артефактов.


5. HEALTHCHECK

Добавляет проверку “жив ли контейнер”:

HEALTHCHECK —interval=30s —timeout=5s
CMD curl -f http://localhost/healthz || exit 1

🔹 Зачем: Docker сможет определить, когда контейнер «сломался».
🔹 Когда: при работе с веб-приложениями и API.


6. CLI —format

Форматируем вывод docker-команд:

docker ps —format ‘{{.ID}}t{{.Names}}t{{.Status}}’

🔹 Зачем: удобно в скриптах и автоматизации.
🔹 Когда: при CI/CD, мониторинге, логировании.


7. Оптимизация Dockerfile для кэша

Стабильные шаги — выше:

COPY package*.json . # редко меняется
RUN npm ci # кэшируется
COPY . . # часто меняется

🔹 Зачем: ускорить повторные сборки.
🔹 Когда: всегда при больших проектах.


8. Ограничение ресурсов

docker run —cpus=»2.0″ —memory=»1g» —memory-swap=»1g» app

🔹 Зачем: предотвратить чрезмерное потребление памяти или CPU.
🔹 Когда: в проде, в CI, при тестах.


9. docker events

Отслеживание событий в реальном времени:

docker events —filter type=container —filter event=start

🔹 Зачем: реагировать на события (запуск, ошибка, удаление).
🔹 Когда: для алертов, логгирования, CI.


10. Read-only контейнеры

docker run —read-only —tmpfs /tmp myapp

🔹 Зачем: защита от записи, предотвращение атак на файловую систему.
🔹 Когда: сервисы, не требующие записи на диск.


11. docker system prune

Удаление неиспользуемых ресурсов:

docker system prune -a —volumes

🔹 Зачем: освободить место, убрать мусор.
🔹 Когда: регулярно в dev/CI-средах.


12. Override ENTRYPOINT

docker run —entrypoint /bin/sh -it myimage

🔹 Зачем: обойти основной процесс и получить shell-доступ.
🔹 Когда: отладка, аварийное восстановление.


13. Docker Contexts

docker context create prod —docker «host=ssh://user@prod-host»
docker context use prod

🔹 Зачем: переключаться между удалёнными хостами без изменения переменных окружения.
🔹 Когда: multi-env деплой (local/staging/prod).


🔥 Итого:
Каждый из этих трюков делает вашу работу с Docker надёжнее, быстрее и безопаснее. Внедряйте выборочно: начните с тех, что закроют текущие боли (большой размер → squash, CI медленный → кеш, прод небезопасен → read-only + healthcheck).