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

Введение

Docker — это не просто утилита для запуска контейнеров. Это экосистема, в которой правильный промт (или, если хотите, команда или шаблон) решает половину задачи. За годы работы с контейнеризацией я перепробовал десятки подходов к написанию Dockerfile, сборке образов и настройке Compose. В этой статье я собрал 12 промтов — от базовых до экспертных, которые помогут вам писать эффективные, лёгкие и безопасные конфигурации. Каждый промт сопровождается примером кода и практическим советом. Поехали.

1. Базовый Dockerfile для Python-приложения

Задача: Упаковать Python-скрипт с зависимостями.
Промт: Используйте официальный образ python:3.11-slim, установите зависимости через pip, скопируйте код и задайте точку входа.
Пример:

FROM python:3.11-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
CMD ["python", "app.py"]

Совет: --no-cache-dir уменьшает размер образа на 30–50 МБ. Всегда указывайте точную версию Python, а не latest.

2. Dockerfile с multi-stage сборкой для Go

Задача: Собрать бинарник Go и поместить его в минимальный образ.
Промт: Используйте два stage: первый — образ Go для компиляции, второй — scratch или alpine для запуска.
Пример:

# Stage 1: build
FROM golang:1.22-alpine AS builder
WORKDIR /src
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN CGO_ENABLED=0 go build -o /app/myapp .

# Stage 2: run
FROM alpine:3.20
COPY --from=builder /app/myapp /usr/local/bin/myapp
CMD ["myapp"]

Результат: Образ размером ~10 МБ вместо 800 МБ. Идеально для микросервисов.

3. Промт для .dockerignore

Задача: Исключить лишние файлы из контекста сборки.
Промт: Создайте .dockerignore и перечислите всё, что не нужно в образе: node_modules, .git, venv, *.log.
Пример:

node_modules
.git
*.log
.env
__pycache__

Совет: Это ускоряет сборку в 2–3 раза и уменьшает риск попадания секретов в образ.

4. Docker Compose для связки веб-приложения и БД

Задача: Запустить FastAPI + PostgreSQL в одной сети.
Промт: Определите два сервиса: web и db. Используйте depends_on и .env для переменных.
Пример:

version: '3.9'
services:
  web:
    build: .
    ports:
      - "8000:8000"
    environment:
      - DATABASE_URL=postgresql://user:pass@db:5432/mydb
    depends_on:
      - db
  db:
    image: postgres:16
    environment:
      POSTGRES_USER: user
      POSTGRES_PASSWORD: pass
    volumes:
      - pgdata:/var/lib/postgresql/data
volumes:
  pgdata:

Результат: Локальная разработка за 2 минуты. depends_on гарантирует порядок запуска.

5. Оптимизация слоёв через RUN chaining

Задача: Уменьшить количество слоёв и размер образа.
Промт: Объединяйте команды RUN через &&, очищайте временные файлы в том же слое.
Пример:

RUN apt-get update && \
    apt-get install -y --no-install-recommends curl && \
    rm -rf /var/lib/apt/lists/*

Почему это важно: Каждая инструкция RUN, COPY, ADD создаёт слой. Меньше слоёв — быстрее скачивание и меньше кэш-промахов.

6. Использование HEALTHCHECK для сервисов

Задача: Автоматически перезапускать контейнер, если приложение упало.
Промт: Добавьте HEALTHCHECK в Dockerfile или в compose.
Пример (Dockerfile):

HEALTHCHECK --interval=30s --timeout=3s --retries=3 \
  CMD curl -f http://localhost:8080/health || exit 1

Совет: Для production обязательно настраивайте healthcheck — это стандарт SRE.

7. Non-root user в контейнере

Задача: Повысить безопасность: не запускать приложение от root.
Промт: Создайте пользователя и группу через RUN adduser и переключитесь на него через USER.
Пример:

RUN addgroup -S appgroup && adduser -S appuser -G appgroup
USER appuser

Источник: OWASP Docker Security Cheat Sheet рекомендует запускать контейнеры от непривилегированного пользователя.

8. Промт для кэширования зависимостей в CI/CD

Задача: Ускорить сборку в GitHub Actions.
Промт: Используйте cache-from и cache-to в BuildKit.
Пример команды:

docker build --cache-from=myapp:cache --cache-to=type=registry,ref=myapp:cache,mode=max -t myapp:latest .

Результат: Вторая сборка занимает 15 секунд вместо 2 минут. Всё благодаря кэшированию слоёв.

9. Docker Compose с профилями

Задача: Запускать разные наборы сервисов для dev и prod.
Промт: Используйте profiles в Compose.
Пример:

services:
  app:
    image: myapp
  redis:
    image: redis:7
    profiles: ["dev"]
  monitoring:
    image: prom/prometheus
    profiles: ["prod"]

Запуск: docker compose --profile dev up — только app и redis.

10. Промт для миграций БД в контейнере

Задача: Выполнить миграции перед запуском приложения.
Промт: Используйте initContainers (Kubernetes) или скрипт entrypoint.sh.
Пример entrypoint.sh:

#!/bin/sh
flask db upgrade
exec "$@"

Dockerfile: COPY entrypoint.sh /entrypoint.sh && RUN chmod +x /entrypoint.sh и ENTRYPOINT ["/entrypoint.sh"].

11. Multi-stage для Node.js с разными менеджерами

Задача: Собрать production-образ Node.js без devDependencies.
Промт: Первый stage — установка всех зависимостей, второй — только production.
Пример:

FROM node:20-alpine AS builder
WORKDIR /build
COPY package*.json ./
RUN npm ci --only=production

FROM node:20-alpine
WORKDIR /app
COPY --from=builder /build/node_modules ./node_modules
COPY . .
CMD ["node", "server.js"]

Размер: ~150 МБ вместо 500 МБ.

12. Промт для секретов в Docker Build

Задача: Передать API-ключ во время сборки, не оставляя его в образе.
Промт: Используйте --secret в BuildKit.
Пример:

docker build --secret id=my_api_key,src=./secret.txt -t myapp .

В Dockerfile:

RUN --mount=type=secret,id=my_api_key \
    export API_KEY=$(cat /run/secrets/my_api_key) && \
    ./build.sh

Совет: Никогда не используйте ARG для секретов — они остаются в истории слоёв.

Заключение

Эти 12 промтов — база, которую я использую ежедневно. От простого Dockerfile до multi-stage сборок и секретов — каждый из них решает конкретную проблему: уменьшение размера, ускорение сборки или безопасность. Начните с малого: добавьте .dockerignore, переключитесь на non-root пользователя, попробуйте multi-stage. Ваши образы станут легче, а разворачивание — быстрее. А если хотите углубиться — подпишитесь на блог Asibiont: мы пишем о контейнерах и DevOps без воды.

← Все статьи

Комментарии

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

TFT LCD (ILI9341, ST7789) под контролем AI-агента: как ASI Biont управляет дисплеями через MQTT и COM-порт

19 июля 2026

Интеграция Asset Tracking с AI-агентом ASI Biont: MQTT, GPS и автоматизация склада

19 июля 2026

Как интегрировать Яндекс.Почту с ASI Biont: Автоматизация электронной почты без кода с помощью ИИ-агента

19 июля 2026

Интеграция Raspberry Pi + TensorFlow Lite / ONNX Runtime с AI-агентом ASI Biont: Edge AI без кода

19 июля 2026

Как подключить 7-сегментный дисплей TM1637 к AI-агенту ASI Biont: пошаговое руководство по интеграции для IoT-автоматизации

19 июля 2026

Мастер BI-аналитики и дашбордов: пошаговый план с обучением на основе ИИ

19 июля 2026

Как язык меняет личность Claude: неожиданное открытие Anthropic в 2026 году

19 июля 2026

Автоматизация мультивалютных платежей с Wise и AI-агентом ASI Biont: руководство по интеграции без кода

19 июля 2026

Внутреннее устройство Harness-агентов: разбор исходников Codex, OpenCode, Pi и собственных решений

19 июля 2026