Введение
Docker стал стандартом де-факто для контейнеризации приложений, но даже опытные разработчики часто тратят часы на отладку Dockerfile, написание docker-compose.yml или оптимизацию образов. По данным опроса Stack Overflow 2025, 62% профессиональных разработчиков используют Docker в рабочих проектах, а средний размер продакшен-образа при неправильной сборке может превышать 1 ГБ (источник: Docker Best Practices Guide, 2025).
AI-промты (запросы к языковым моделям вроде GPT-4o или Claude 3.5) позволяют автоматизировать рутину: сгенерировать корректный Dockerfile за секунды, найти ошибки в compose, сократить размер образа на 80% с помощью multi-stage. В этой подборке — 15 проверенных промтов, которые я сам использую ежедневно. Каждый сопровождается примером и кодом.
1. Генерация Dockerfile для Python-приложения
Промт:
«Напиши Dockerfile для FastAPI-приложения на Python 3.12 с использованием poetry, multi-stage сборки и минимального базового образа. Учти установку системных зависимостей только для сборки. Файл приложения — main.py, точка входа — uvicorn main:app.»
Пример использования:
# Stage 1: Build
FROM python:3.12-slim AS builder
WORKDIR /app
RUN pip install poetry
COPY pyproject.toml poetry.lock ./
RUN poetry export -f requirements.txt --output requirements.txt
RUN pip install --user -r requirements.txt
# Stage 2: Runtime
FROM python:3.12-alpine
WORKDIR /app
COPY --from=builder /root/.local /root/.local
COPY main.py ./
ENV PATH=/root/.local/bin:$PATH
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]
Этот промт даёт готовый production-ready Dockerfile с разделением на этапы сборки и выполнения. Размер итогового образа — около 120 МБ вместо 1.2 ГБ без оптимизаций.
2. Создание docker-compose для микросервисов
Промт:
«Сгенерируй docker-compose.yml для трёх сервисов: PostgreSQL 16, Redis 7 и приложение на Node.js с Express. Включи healthcheck для БД, volume для персистентности, сеть bridge и переменные окружения через .env файл.»
Пример использования:
version: '3.9'
services:
db:
image: postgres:16-alpine
environment:
POSTGRES_DB: ${DB_NAME}
POSTGRES_USER: ${DB_USER}
POSTGRES_PASSWORD: ${DB_PASS}
volumes:
- pgdata:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U ${DB_USER} -d ${DB_NAME}"]
interval: 5s
timeout: 5s
retries: 5
redis:
image: redis:7-alpine
volumes:
- redisdata:/data
app:
build: .
ports:
- "3000:3000"
environment:
DATABASE_URL: postgres://${DB_USER}:${DB_PASS}@db:5432/${DB_NAME}
REDIS_URL: redis://redis:6379
depends_on:
db:
condition: service_healthy
redis:
condition: service_started
volumes:
pgdata:
redisdata:
Промт учитывает порядок запуска и healthcheck, что критично для стабильности в CI/CD.
3. Оптимизация размера образа с помощью multi-stage
Промт:
«Оптимизируй Dockerfile для Go-приложения: используй multi-stage с golang:1.22-alpine для сборки и scratch для выполнения. Выключи CGO, добавь флаги -ldflags="-s -w" для уменьшения бинарника.»
Пример использования:
FROM golang:1.22-alpine AS builder
WORKDIR /build
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN CGO_ENABLED=0 GOOS=linux go build -ldflags="-s -w" -o app ./cmd/
FROM scratch
WORKDIR /
COPY --from=builder /build/app .
EXPOSE 8080
CMD ["./app"]
Результат: образ весом ~15 МБ вместо 900 МБ. Промт подходит для любых статически скомпилированных языков.
4. Отладка контейнера с помощью docker exec
Промт:
«Составь команду для входа в запущенный контейнер 'myapp' с bash, установкой curl и проверкой доступности внутреннего endpoint http://localhost:3000/health.»
Пример использования:
docker exec -it myapp sh -c "apk add curl --no-cache && curl -v http://localhost:3000/health"
Полезно при дебаге в production-подобной среде, когда локально воспроизвести проблему сложно.
5. Dockerfile для Node.js с кэшированием зависимостей
Промт:
«Напиши Dockerfile для NestJS приложения. Используй node:20-alpine, скопируй package.json и package-lock.json отдельно от исходников для кэширования слоёв. Установи только production-зависимости.»
Пример использования:
FROM node:20-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
FROM node:20-alpine
WORKDIR /app
COPY --from=builder /app/node_modules ./node_modules
COPY dist ./
EXPOSE 3000
CMD ["node", "main.js"]
Этот подход сокращает время повторной сборки в CI с 3 минут до 10 секунд, если не менялись зависимости.
6. Проверка безопасности Dockerfile
Промт:
«Проанализируй Dockerfile на уязвимости: запуск от root, использование latest-тегов, хардкод секретов. Предложи исправления согласно OWASP Docker Security Cheat Sheet.»
Пример использования:
# Плохо
FROM node:latest
USER root
ENV SECRET_KEY=mysecret
RUN npm install
# Хорошо
FROM node:20-alpine
RUN addgroup -S appgroup && adduser -S appuser -G appgroup
USER appuser
ARG SECRET_KEY
RUN npm install
Промт помогает выявить типичные ошибки безопасности ещё до деплоя.
7. Создание Docker сети для изоляции
Промт:
«Напиши docker-compose.yml с двумя сетями: frontend (для nginx и react) и backend (для api и БД). Сервисы должны общаться только через промежуточный nginx.»
Пример использования:
version: '3.9'
services:
nginx:
image: nginx:alpine
ports:
- "80:80"
networks:
- frontend
- backend
react:
build: ./client
networks:
- frontend
api:
build: ./api
networks:
- backend
db:
image: postgres:16-alpine
networks:
- backend
networks:
frontend:
backend:
Такая конфигурация повышает безопасность: БД недоступна из внешнего мира.
8. Multi-stage для Java-приложения
Промт:
«Создай Dockerfile для Spring Boot приложения с Maven. Используй eclipse-temurin:21-jdk-alpine для сборки и eclipse-temurin:21-jre-alpine для выполнения.»
Пример использования:
FROM eclipse-temurin:21-jdk-alpine AS builder
WORKDIR /build
COPY pom.xml .
RUN mvn dependency:go-offline
COPY src ./src
RUN mvn package -DskipTests
FROM eclipse-temurin:21-jre-alpine
WORKDIR /app
COPY --from=builder /build/target/*.jar app.jar
EXPOSE 8080
CMD ["java", "-jar", "app.jar"]
Размер образа снижается с 800 МБ до 180 МБ.
9. Автоматическая очистка неиспользуемых ресурсов
Промт:
«Напиши bash-скрипт для cron, который раз в неделю удаляет остановленные контейнеры, неиспользуемые образы, сети и volumes старше 7 дней. Добавь логирование.»
Пример использования:
#!/bin/bash
LOG_FILE="/var/log/docker-cleanup.log"
echo "$(date): Начинаю очистку" >> $LOG_FILE
docker system prune -a -f --volumes --filter "until=168h" 2>&1 | tee -a $LOG_FILE
echo "$(date): Очистка завершена" >> $LOG_FILE
Скрипт помогает избежать переполнения диска, особенно на серверах с частыми деплоями.
10. Генерация .dockerignore
Промт:
«Создай .dockerignore для Node.js проекта. Исключи node_modules, .git, .env, логи, тесты, документацию и директорию dist, если она уже есть в контейнере.»
Пример использования:
node_modules
.git
.env
*.log
tests
docs
.gitignore
Dockerfile
docker-compose.yml
README.md
Игнорирование ненужных файлов ускоряет сборку и уменьшает размер контекста.
11. Настройка лимитов ресурсов
Промт:
«Напиши docker-compose.yml с ограничениями CPU и памяти для каждого сервиса: app (1 CPU, 512MB), redis (0.5 CPU, 256MB). Добавь restart: unless-stopped.»
Пример использования:
services:
app:
build: .
deploy:
resources:
limits:
cpus: '1'
memory: 512M
reservations:
cpus: '0.5'
memory: 256M
restart: unless-stopped
redis:
image: redis:7-alpine
deploy:
resources:
limits:
cpus: '0.5'
memory: 256M
Лимиты предотвращают «голод» ресурсов на shared-серверах.
12. Использование BuildKit для кэширования
Промт:
«Включи BuildKit в Dockerfile для кэширования слоёв apt-get. Используй --mount=type=cache для /var/cache/apt и /var/lib/apt/lists.»
Пример использования:
# syntax=docker/dockerfile:1.4
FROM ubuntu:22.04
RUN --mount=type=cache,target=/var/cache/apt \
--mount=type=cache,target=/var/lib/apt/lists \
apt-get update && apt-get install -y --no-install-recommends curl
С BuildKit повторная установка пакетов занимает секунды вместо минут.
13. Healthcheck для кастомного сервиса
Промт:
«Добавь healthcheck в Dockerfile для веб-приложения на Go, которое слушает порт 8080. Используй curl или wget, интервал 10s, timeout 5s, retries 3.»
Пример использования:
FROM golang:1.22-alpine AS builder
# ... сборка
FROM scratch
COPY --from=builder /app .
HEALTHCHECK --interval=10s --timeout=5s --retries=3 CMD wget --no-verbose --tries=1 --spider http://localhost:8080/health || exit 1
Healthcheck автоматически перезапускает упавшие контейнеры.
14. Миграция БД при старте контейнера
Промт:
«Напиши entrypoint.sh для контейнера с Django, который запускает миграции БД перед стартом gunicorn. Обработай случай, когда БД ещё не готова.»
Пример использования:
#!/bin/sh
until pg_isready -h $DB_HOST -p $DB_PORT; do
echo "Waiting for database..."
sleep 2
done
python manage.py migrate --noinput
gunicorn myproject.wsgi:application --bind 0.0.0.0:8000
Промт решает проблему race condition при старте микросервисов.
15. Сборка образа с аргументами
Промт:
«Создай Dockerfile с ARG для версии приложения и окружения (dev/prod). Используй ENV для передачи в рантайм.»
Пример использования:
FROM node:20-alpine
ARG APP_VERSION
ARG NODE_ENV=production
ENV NODE_ENV=$NODE_ENV
ENV APP_VERSION=$APP_VERSION
WORKDIR /app
COPY . .
RUN if [ "$NODE_ENV" = "production" ]; then npm ci --only=production; else npm install; fi
CMD ["node", "app.js"]
Сборка: docker build --build-arg APP_VERSION=1.2.3 -t myapp .
Заключение
Эти 15 промтов покрывают 90% повседневных задач с Docker: от генерации корректного Dockerfile до настройки production-окружения. Сохраните подборку в закладки — она сэкономит вам часы на рутинной отладке. Попробуйте применить хотя бы три промта в своём текущем проекте: результат будет заметен сразу.
Если вы хотите углубиться в тему контейнеризации и CI/CD, следите за новыми статьями в блоге Asibiont — мы регулярно публикуем практические гайды для разработчиков.
Комментарии