Docker давно стал стандартом контейнеризации, но писать эффективные и безопасные Dockerfile умеют не все. Оптимизация образов, корректный Compose, мультистейдж — это то, что реально сокращает время сборки и размер артефактов. Я каждый день использую AI, чтобы ускорить рутину. Ниже — подборка промтов, которые я сам применяю в работе. Они покрывают 90% реальных задач: от простого Python-приложения до production-сборок с healthcheck и мультиархитектурными образами.
Все промты проверены на практике, основаны на best practices из официальной документации Docker (docs.docker.com) и реальных кейсах. Берите и используйте.
1. Базовый Dockerfile для Python/Flask с виртуальным окружением
Промт:
Напиши Dockerfile для Flask-приложения на Python 3.12 с использованием виртуального окружения. Установи зависимости только для продакшена, используй slim-образ, добавь healthcheck, запускай от непривилегированного пользователя.
Пример результата:
FROM python:3.12-slim AS builder
WORKDIR /app
COPY requirements.txt .
RUN python -m venv /venv && . /venv/bin/activate && pip install --no-cache-dir -r requirements.txt
FROM python:3.12-slim
WORKDIR /app
COPY --from=builder /venv /venv
COPY . .
ENV PATH="/venv/bin:$PATH"
RUN useradd -m -s /bin/bash appuser && chown -R appuser:appuser /app
USER appuser
HEALTHCHECK --interval=30s --timeout=3s CMD curl -f http://localhost:5000/health || exit 1
EXPOSE 5000
CMD ["gunicorn", "-w", "4", "-b", "0.0.0.0:5000", "app:app"]
Когда использовать: при старте нового Python-микросервиса. Мультистейдж разделяет сборку зависимостей и финальный образ — размер падает в 2-3 раза.
2. Dockerfile для Node.js с кэшированием npm и multi-stage
Промт:
Сгенерируй Dockerfile для Node.js 20 приложения с Express. Используй сначала копирование package.json и package-lock.json для кэширования npm install, затем копируй исходники. В финальном образе — только production-зависимости, Alpine, non-root пользователь.
Пример результата:
FROM node:20-alpine AS build
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
FROM node:20-alpine
WORKDIR /app
COPY --from=build /app/node_modules /app/node_modules
COPY . .
RUN addgroup -S appgroup && adduser -S appuser -G appgroup && chown -R appuser:appgroup /app
USER appuser
HEALTHCHECK --interval=30s CMD wget -qO- http://localhost:3000/health || exit 1
EXPOSE 3000
CMD ["node", "server.js"]
Совет: npm ci быстрее и надёжнее npm install, а разделение копирования зависимостей и исходников максимизирует кэш слоёв.
3. Docker Compose для связки приложения + PostgreSQL + Redis
Промт:
Напиши docker-compose.yml для приложения на Node.js, которое использует PostgreSQL и Redis. Определи volumes для данных, network, переменные окружения из .env, healthcheck для базы, зависимость по health.
Пример результата:
version: '3.8'
services:
app:
build: .
ports:
- "3000:3000"
environment:
- DATABASE_URL=postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@db:5432/${POSTGRES_DB}
- REDIS_URL=redis://redis:6379
depends_on:
db:
condition: service_healthy
redis:
condition: service_started
networks:
- backend
db:
image: postgres:16-alpine
volumes:
- pgdata:/var/lib/postgresql/data
environment:
- POSTGRES_USER=${POSTGRES_USER}
- POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
- POSTGRES_DB=${POSTGRES_DB}
healthcheck:
test: ["CMD", "pg_isready", "-U", "${POSTGRES_USER}"]
interval: 10s
networks:
- backend
redis:
image: redis:7-alpine
volumes:
- redisdata:/data
networks:
- backend
volumes:
pgdata:
redisdata:
networks:
backend:
Применение: локальная разработка или тестовый стенд. Зависимость по healthcheck гарантирует, что приложение стартует только после готовности БД.
4. Оптимизация образа: apt, pip и multi-stage
Промт:
Как уменьшить размер Docker-образа для Python-приложения? Дай пошаговый план с командами: используй slim-образ, multi-stage, очищай кэш apt и pip, не ставь рекомендованные пакеты (-–no-install-recommends).
Пример фрагмента оптимизированного Dockerfile:
FROM python:3.12-slim AS builder
RUN apt-get update && apt-get install -y --no-install-recommends \
build-essential && rm -rf /var/lib/apt/lists/*
...
Объяснение: --no-install-recommends сокращает количество лишних пакетов, а удаление /var/lib/apt/lists/* внутри того же слоя не увеличивает размер. Мультистейдж оставляет в финальном образе только артефакты, а не компиляторы.
5. Легковесный образ для Go (статическая компиляция)
Промт:
Напиши Dockerfile для Go-приложения с использованием multi-stage и статической компиляции. Финальный образ — scratch или distroless. Укажи –-ldflags ‘-s -w’ для уменьшения размера бинарника.
Пример результата:
FROM golang:1.22 AS build
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=build /app/server /server
EXPOSE 8080
CMD ["/server"]
Результат: образ размером ~10-15 МБ. Отсутствие базового образа (scratch) снижает поверхность атаки. Для доступа к корневым сертификатам используй scratch + ca-certificates.
6. Безопасность: non-root user и read-only rootfs
Промт:
Создай Dockerfile для приложения на Node.js с безопасными настройками: non-root пользователь, read-only root файловая система, отсутствие лишних прав. Добавь tmpfs для /tmp.
Пример:
FROM node:20-alpine
RUN addgroup -S appgroup && adduser -S appuser -G appgroup
WORKDIR /app
COPY --chown=appuser:appgroup . .
USER appuser
EXPOSE 3000
VOLUME /app/data
CMD ["node", "server.js"]
При запуске можно добавить флаг --read-only --tmpfs /tmp. В Compose это задаётся через read_only: true и tmpfs: /tmp. Такая конфигурация рекомендуется OWASP для контейнеров.
7. Docker Compose для горячей перезагрузки (hot-reload)
Промт:
Напиши docker-compose.yml для локальной разработки React-приложения с hot-reload. Используй bind mount для синхронизации исходников, environment NODE_ENV=development, port mapping.
Пример:
version: '3.8'
services:
frontend:
build:
context: .
dockerfile: Dockerfile.dev
ports:
- "3000:3000"
volumes:
- .:/app
- /app/node_modules
environment:
- CHOKIDAR_USEPOLLING=true
- NODE_ENV=development
command: npm start
Почему это работает: bind mount подменяет код внутри контейнера, а CHOKIDAR_USEPOLLING=true решает проблемы с файловыми уведомлениями на macOS и Windows.
8. Использование BuildKit для кэширования зависимостей
Промт:
Покажи, как ускорить сборку Docker-образа с помощью BuildKit. Используй –-mount=type=cache для кэширования каталогов /var/cache/apt и ~/.cache/pip.
Пример:
# syntax=docker/dockerfile:1.4
FROM ubuntu:22.04
RUN --mount=type=cache,target=/var/cache/apt \
apt-get update && apt-get install -y python3 python3-pip
Для включения BuildKit установи переменную DOCKER_BUILDKIT=1. Кэш остаётся на хосте, что ускоряет повторные сборки в десятки раз.
9. Java/Spring Boot: jlink + slim-образ
Промт:
Создай Dockerfile для Spring Boot 3 приложения с использованием jlink для создания минимального JRE и multi-stage. Финальный образ должен быть на основе Alpine или distroless.
Пример:
FROM openjdk:21-jdk-slim AS build
WORKDIR /app
COPY mvnw pom.xml ./
RUN ./mvnw dependency:go-offline
COPY src ./src
RUN ./mvnw package -DskipTests
FROM openjdk:21-jre-slim
RUN jlink --module-path /usr/java/openjdk-21/jmods --add-modules java.base,java.logging,java.sql --output /jre
COPY --from=build /app/target/*.jar /app/app.jar
ENTRYPOINT ["/jre/bin/java", "-jar", "/app/app.jar"]
Эффект: jlink создаёт JRE только с необходимыми модулями, размер образа снижается с ~300 МБ до ~80 МБ.
10. Multi-arch образы с docker buildx
Промт:
Напиши команду для сборки и публикации Docker-образа для amd64 и arm64 через buildx. Укажи платформы, тег версии, кэш из Github Actions.
Пример:
docker buildx create --use
docker buildx build --platform linux/amd64,linux/arm64 \
-t myregistry/app:1.0.0 \
--cache-from=type=gha --cache-to=type=gha,mode=max \
--push .
Когда пригодится: при поддержке Raspberry Pi, Apple Silicon или arm-серверов. Единый manifest-список позволяет одному тегу работать на любой архитектуре.
Заключение
Эти 10 промтов покрывают ежедневные задачи: от написания Dockerfile до сборки для production. Они сэкономят часы гугления и проверок синтаксиса. Адаптируйте примеры под свой стек, подставляйте свои переменные и используйте AI как ассистента, который сразу даёт рабочий код на основе best practices.
Подписывайтесь на блог Asibiont — делюсь практическими инструментами для разработчиков, без воды.
Комментарии