Введение
Docker стал стандартом де-факто для контейнеризации приложений. Однако даже опытные разработчики часто тратят часы на отладку Dockerfile, настройку Compose или оптимизацию образов. Я собрал 12 проверенных промтов, которые сам использую в работе ежедневно. Каждый — с реальным примером и пояснением. Никакой воды, только практика.
1. Создание эффективного Dockerfile
Промт: «Напиши Dockerfile для Node.js приложения с multi-stage сборкой. Первый этап: установка зависимостей и сборка. Второй этап: минимальный образ на основе Alpine. Используй .dockerignore. Укажи non-root пользователя.»
Зачем: Многие пишут Dockerfile в один этап, включая dev-зависимости в финальный образ. Это увеличивает размер и поверхность атаки. Multi-stage решает обе проблемы.
Пример:
FROM node:18-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
COPY . .
RUN npm run build
FROM node:18-alpine
RUN addgroup -S appgroup && adduser -S appuser -G appgroup
WORKDIR /app
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/node_modules ./node_modules
USER appuser
CMD ["node", "dist/index.js"]
2. Оптимизация кэширования слоёв
Промт: «Перепиши Dockerfile так, чтобы максимально использовать кэш Docker. Раздели копирование package.json и установку зависимостей от копирования исходного кода. Добавь комментарии, объясняющие порядок слоёв.»
Зачем: Каждый RUN, COPY, ADD создаёт слой. Если менять код, но не зависимости — кэш для установки зависимостей останется валидным. Это ускоряет сборку в разы.
Пример:
# Сначала копируем только то, что редко меняется
COPY package.json yarn.lock ./
RUN yarn install --frozen-lockfile
# Потом код — меняется часто
COPY . .
3. Docker Compose для локальной разработки
Промт: «Создай docker-compose.yml для веб-приложения с PostgreSQL, Redis и сервисом на FastAPI. Добавь volume для хранения данных БД, healthcheck для каждого сервиса и сеть bridge. Используй переменные окружения из .env.»
Зачем: Однотипные Compose-файлы для каждого проекта — потеря времени. Этот промт даёт готовый шаблон с best practices.
Пример:
version: '3.9'
services:
db:
image: postgres:15
volumes:
- postgres_data:/var/lib/postgresql/data
healthcheck:
test: ["CMD", "pg_isready", "-U", "postgres"]
env_file: .env
redis:
image: redis:7-alpine
healthcheck:
test: ["CMD", "redis-cli", "ping"]
app:
build: .
depends_on:
db:
condition: service_healthy
redis:
condition: service_healthy
ports:
- "8000:8000"
volumes:
postgres_data:
4. Минимизация размера образа
Промт: «Проанализируй Dockerfile и предложи способы уменьшить финальный образ. Используй distroless или scratch, объединяй RUN-команды, удаляй временные файлы в той же инструкции.»
Зачем: Большие образы медленнее пушатся и пуллятся. По данным DockerCon, средний образ можно уменьшить на 40-60% без потери функциональности.
Пример: Вместо:
RUN apt-get update
RUN apt-get install -y curl
RUN apt-get clean
Пишем:
RUN apt-get update && apt-get install -y curl --no-install-recommends && rm -rf /var/lib/apt/lists/*
5. Healthcheck в Dockerfile
Промт: «Добавь HEALTHCHECK в Dockerfile для Python-приложения на Flask. Проверяй эндпоинт /health. Укажи интервал 30s, timeout 10s, retries 3.»
Зачем: Без healthcheck Docker не знает, живо ли приложение. Это критично для оркестрации (Kubernetes, Swarm).
Пример:
HEALTHCHECK --interval=30s --timeout=10s --start-period=5s --retries=3 \
CMD curl -f http://localhost:5000/health || exit 1
6. Использование аргументов сборки (ARG)
Промт: «Перепиши Dockerfile с использованием ARG для версии Node.js, порта и режима сборки (development/production). Укажи значения по умолчанию.»
Зачем: Один Dockerfile для разных окружений — без дублирования.
Пример:
ARG NODE_VERSION=18
FROM node:${NODE_VERSION}-alpine
ARG PORT=3000
ENV PORT=${PORT}
EXPOSE ${PORT}
7. Multi-stage для Go-приложения
Промт: «Создай multi-stage Dockerfile для Go-приложения. Первый этап: сборка с Go образ. Второй: scratch с бинарником. Добавь флаги компиляции для уменьшения размера.»
Зачем: Go-бинарники статически скомпилированы, им не нужен образ с OS. Scratch даёт образ <10 MB.
Пример:
FROM golang:1.21 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 .
FROM scratch
COPY --from=builder /app/server /
CMD ["/server"]
8. Логирование и мониторинг в Compose
Промт: «Добавь в docker-compose.yml настройки логирования (драйвер json-file с ротацией) и метрики (cAdvisor для сбора метрик контейнеров).»
Зачем: По умолчанию логи растут бесконтрольно. Ротация — must have.
Пример:
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "3"
9. Сети и изоляция
Промт: «Создай docker-compose.yml с тремя сетями: frontend, backend, db. Помести Nginx в frontend, приложение в backend, PostgreSQL в db. Разреши трафик только между нужными сервисами.»
Зачем: Микросегментация повышает безопасность.
10. Secrets management
Промт: «Покажи, как передать секреты (пароль БД, API-ключ) в Docker Compose без хранения в Dockerfile или переменных окружения в открытом виде. Используй secrets.»
Зачем: Переменные окружения видны в docker inspect. Secrets — безопаснее.
11. Dockerfile для Python с Poetry
Промт: «Напиши Dockerfile для Python-приложения, использующего Poetry. Установи зависимости в отдельном слое, используй virtualenv внутри контейнера.»
12. Автоматическая очистка
Промт: «Составь bash-скрипт для очистки неиспользуемых образов, контейнеров, volumes и сетей. Добавь подтверждение перед удалением.»
Заключение
Эти промты покрывают 90% повседневных задач с Docker. Сохрани их в свой workflow — и забудь о ручной отладке. Попробуй прямо сейчас: возьми свой текущий Dockerfile и примени первый промт. Результат удивит.
Комментарии