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

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.5
RUN --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).