7 промтов для Docker: от Dockerfile до оптимизации образов и multi-stage сборок

Введение

Docker — стандарт де-факто для контейнеризации приложений. Но даже опытные разработчики часто тратят часы на написание эффективных Dockerfile и docker-compose.yml, а затем — на отладку и оптимизацию образов. В 2026 году, когда каждый мегабайт образа влияет на скорость деплоя и стоимость хранения в registry, умение быстро генерировать правильные конфиги — ключевой навык.

Я собрал 7 проверенных промтов, которые использую сам каждый день. Они помогают:
- Создать Dockerfile под конкретный язык и фреймворк за 10 секунд.
- Настроить docker-compose для микросервисной архитектуры.
- Применить multi-stage сборки и уменьшить образ в 3–5 раз.
- Избежать типовых ошибок безопасности (например, запуск от root, лишние слои).

Все промты — с реальными примерами применения. Бери и используй.

1. Промт: «Напиши production-ready Dockerfile для [язык/фреймворк]»

Когда использовать: нужно быстро получить рабочий Dockerfile с учётом best practices (не root, минимальный образ, кэширование зависимостей).

Промт:

Напиши production-ready Dockerfile для Node.js (Express) приложения. Используй официальный образ node:20-alpine. Установи зависимости отдельно от кода для кэширования слоёв. Запускай приложение от непривилегированного пользователя (node). Укажи HEALTHCHECK. Минимизируй количество слоёв.

Результат (пример вывода):

FROM node:20-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production && npm cache clean --force

FROM node:20-alpine
RUN addgroup -S appgroup && adduser -S appuser -G appgroup
WORKDIR /app
COPY --from=builder /app/node_modules ./node_modules
COPY . .
USER appuser
EXPOSE 3000
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
  CMD wget --no-verbose --tries=1 --spider http://localhost:3000/health || exit 1
CMD ["node", "server.js"]

Почему это работает:
- Разделение установки зависимостей и копирования кода позволяет кэшировать слой с node_modules — пересборка при изменении кода не переустанавливает пакеты.
- Alpine образ даёт ~5 МБ базового размера против ~150 МБ у полного Node.
- Запуск от appuser (UID 1000) вместо root снижает риски при компрометации контейнера.

2. Промт: «Сгенерируй docker-compose для микросервисов: API, БД, Redis, очередь»

Когда использовать: настройка локального окружения для разработки или тестирования.

Промт:

Создай docker-compose.yml для микросервисного приложения: 
- сервис api (Node.js, порт 3000)
- сервис auth (Go, порт 8080)
- PostgreSQL 16
- Redis 7
- RabbitMQ 3.12
Используй сети: frontend (для api и auth) и backend (для БД, Redis, RabbitMQ). Укажи volumes для персистентности данных. Добавь healthcheck для каждого сервиса.

Результат (фрагмент):

version: '3.9'
services:
  api:
    build: ./api
    ports:
      - "3000:3000"
    networks:
      - frontend
      - backend
    depends_on:
      postgres:
        condition: service_healthy
      redis:
        condition: service_healthy
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:3000/health"]
      interval: 30s
      retries: 3
      start_period: 10s
  postgres:
    image: postgres:16-alpine
    environment:
      POSTGRES_PASSWORD: ${DB_PASSWORD}
    volumes:
      - postgres_data:/var/lib/postgresql/data
    networks:
      - backend
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U postgres"]
      interval: 10s
      retries: 5
  redis:
    image: redis:7-alpine
    volumes:
      - redis_data:/data
    networks:
      - backend
    healthcheck:
      test: ["CMD", "redis-cli", "ping"]
      interval: 10s
      retries: 5
  rabbitmq:
    image: rabbitmq:3.12-management-alpine
    networks:
      - backend
    healthcheck:
      test: ["CMD", "rabbitmq-diagnostics", "check_running"]
      interval: 30s
      retries: 3

volumes:
  postgres_data:
  redis_data:

networks:
  frontend:
  backend:

Почему это важно:
- Разделение сетей изолирует сервисы: api и auth видят только друг друга, но не имеют доступа к Redis напрямую (кроме как через backend).
- Healthcheck с condition: service_healthy гарантирует, что api не запустится, пока БД не готова принимать соединения.
- Переменная ${DB_PASSWORD} позволяет не хранить секреты в репозитории.

3. Промт: «Оптимизируй Dockerfile через multi-stage для Go приложения»

Когда использовать: нужно собрать бинарник Go и упаковать его в минимальный образ (scratch или distroless).

Промт:

Напиши multi-stage Dockerfile для Go-приложения на основе официального образа golang:1.22-alpine для сборки. Второй этап  scratch или gcr.io/distroless/static-debian12. Скопируй только скомпилированный бинарник. Укажи CGO_ENABLED=0 для статической линковки, чтобы не тащить libc. Добавь метку org.opencontainers.image.source с ссылкой на репозиторий.

Результат:

FROM golang:1.22-alpine AS builder
WORKDIR /app
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN CGO_ENABLED=0 GOOS=linux go build -ldflags="-s -w" -o /app/server ./cmd/server

FROM scratch
COPY --from=builder /app/server /server
EXPOSE 8080
LABEL org.opencontainers.image.source="https://github.com/yourorg/yourrepo"
ENTRYPOINT ["/server"]

Результат оптимизации:
- Образ с scratch — около 7 МБ (против ~300 МБ с полным Go).
- -ldflags="-s -w" удаляет таблицу символов и DWARF-отладочную информацию, уменьшая бинарник на 20–30%.
- Статическая линковка (CGO_ENABLED=0) делает бинарник независимым от библиотек хоста.

4. Промт: «Добавь .dockerignore и проверь на утечку секретов»

Когда использовать: перед публикацией образа в registry нужно исключить лишние файлы и случайные секреты.

Промт:

Создай .dockerignore для Python-проекта. Исключи: .git, __pycache__, .env, .venv, .idea, *.log, node_modules (если есть), Dockerfile. Проверь, что не пропущены файлы с паролями (ключи, токены).

Результат:

.git
__pycache__/
*.pyc
.env
.venv/
.idea/
*.log
Dockerfile
.gitignore
secrets/
*.key
*.pem

Почему это критично:
- Без .dockerignore в образ попадает весь контекст сборки, включая .env с паролями. Docker-образ — это архив, который легко скачать и распаковать.
- __pycache__ и *.pyc — мусор, увеличивающий размер образа без пользы.
- Файлы .key и .pem (приватные ключи) никогда не должны быть в образе.

5. Промт: «Настрой логирование и мониторинг для контейнеров»

Когда использовать: нужно, чтобы логи из контейнеров отправлялись в централизованную систему (например, ELK или Grafana Loki).

Промт:

Напиши docker-compose.yml с сервисами: app (Node.js), fluentd (сборщик логов), elasticsearch 8, kibana. Настрой драйвер логов fluentd для сервиса app. Укажи volumes для персистентности Elasticsearch и конфигурацию fluentd.conf для парсинга JSON-логов.

Результат (фрагмент конфигурации fluentd.conf):

<source>
  @type forward
  port 24224
  bind 0.0.0.0
</source>

<filter **>
  @type parser
  key_name log
  reserve_data true
  remove_key_name_field true
  <parse>
    @type json
  </parse>
</filter>

<match **>
  @type elasticsearch
  host elasticsearch
  port 9200
  logstash_format true
  logstash_prefix dockerlogs
</match>

Почему это удобно:
- Fluentd автоматически парсит JSON-логи (например, {"level":"error","message":"DB timeout"}) и отправляет в Elasticsearch.
- Kibana позволяет строить дашборды: количество ошибок за последний час, топ-5 эндпоинтов по latency.
- Драйвер логов fluentd — встроен в Docker, не требует установки дополнительных агентов.

6. Промт: «Проверь Dockerfile на уязвимости и best practices»

Когда использовать: перед merge request нужно убедиться, что Dockerfile соответствует OWASP и Docker best practices.

Промт:

Проанализируй следующий Dockerfile на уязвимости и нарушения best practices:
FROM ubuntu:latest
RUN apt-get update
RUN apt-get install -y python3
COPY . /app
CMD python3 /app/app.py

Найди проблемы: отсутствие конкретной версии, запуск от root, установка пакетов без очистки кэша, отсутствие HEALTHCHECK, большой образ. Предложи исправленный вариант.

Результат:
- Проблемы:
- ubuntu:latest — плавающий тег, образ может внезапно измениться.
- Два RUN можно объединить в один, чтобы уменьшить количество слоёв.
- Отсутствует очистка кэша apt (rm -rf /var/lib/apt/lists/*).
- Запуск от root.
- Нет HEALTHCHECK.

  • Исправленный вариант:
FROM ubuntu:24.04
RUN apt-get update && apt-get install -y --no-install-recommends python3 && rm -rf /var/lib/apt/lists/*
RUN groupadd -r appgroup && useradd -r -g appgroup appuser
WORKDIR /app
COPY . .
USER appuser
HEALTHCHECK --interval=30s --timeout=3s CMD python3 -c "import urllib.request; urllib.request.urlopen('http://localhost:8000/health')" || exit 1
CMD ["python3", "app.py"]

7. Промт: «Сравни инструменты для сканирования образов: Trivy vs Docker Scout vs Snyk»

Когда использовать: выбираешь инструмент для CI/CD-пайплайна.

Промт:

Сравни Trivy, Docker Scout и Snyk для сканирования Docker-образов на уязвимости. Укажи: способ интеграции в GitHub Actions, типы уязвимостей (OS, библиотеки), скорость сканирования, цена для open-source проектов. Дай рекомендацию для небольшой команды (5 человек).

Результат (таблица):

Критерий Trivy Docker Scout Snyk
Интеграция в GitHub Actions Готовый action: aquasecurity/trivy-action docker/scout-action snyk/actions/setup + snyk/actions/docker
Типы уязвимостей OS (Debian, Alpine, Ubuntu) + библиотеки (pip, npm, Go) OS + библиотеки + лицензии OS + библиотеки + IaC + секреты
Скорость сканирования ~10 сек на образ 500 МБ ~15 сек ~20–30 сек
Цена для open-source Бесплатно, unlimited Бесплатно для публичных образов (ограничение 500 сканирований/мес) Бесплатно: 200 тестов/мес для open-source
Поддержка политик Да, через .trivyignore Да, через scout policy Да, через .snyk

Рекомендация: Для небольшой команды — Trivy. Он быстрее, полностью бесплатен, не требует регистрации, легко встраивается в CI. Docker Scout удобен, если используешь Docker Hub и хочешь видеть уязвимости прямо в UI. Snyk — если нужен единый инструмент для кода, контейнеров и IaC (Terraform, Kubernetes).

Заключение

Эти 7 промтов закрывают 90% повседневных задач с Docker: от генерации Dockerfile до анализа безопасности. Главное — не копировать слепо, а адаптировать под свой проект.

Что запомнить:
1. Multi-stage — ваш главный инструмент для уменьшения образов.
2. Healthcheck и non-root — обязательны для production.
3. .dockerignore — спасёт от утечки секретов.
4. Trivy — лучший бесплатный сканер на 2026 год.
5. Логи через Fluentd — стандарт для централизованного сбора.

Теперь возьми любой из промтов, подставь свои параметры и получи готовый конфиг за минуту. Экономия времени — часы в неделю.

← Все статьи

Комментарии

Читайте также

Интеграция Banana Pi с AI-агентом ASI Biont: автоматизация на одноплатнике без единой строки кода

14 июля 2026

Telegram Bot Development: как автоматизировать бизнес и заработать на ботах в 2026 году

14 июля 2026

AI-агент оживляет завод: интеграция Modbus RTU (RS-485) с ASI Biont для предиктивного обслуживания

14 июля 2026

Uber не хочет быть «всем для всех»: что на самом деле сказал продакт-директор про отели, роботакси и будущее платформы

14 июля 2026

Курс «Промышленный интернет вещей (IIoT) и системы SCADA»: ваш путь к Индустрии 4.0 в 2026 году

14 июля 2026

ИИ незаметно меняет мнения пользователей в соцсетях: как алгоритмы формируют нашу реальность

14 июля 2026

CKA + CKAD — Kubernetes Administrator & Developer: как подготовиться к сертификации в 2026 году с AI-тьютором

14 июля 2026

Как перестать терять сделки из-за языка: обзор курса «Английский для бизнеса» на asibiont.com

14 июля 2026

Трансформационное лидерство и стратегическое мышление CEO: Программа для основателей на уровне Гарварда, желающих овладеть принятием решений

14 июля 2026