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

Docker стал стандартом де-факто для контейнеризации приложений. Однако создание эффективных Dockerfile и Compose-файлов требует не только знания синтаксиса, но и умения формулировать точные запросы (промты) к инструментам, коллегам или AI-ассистентам. В этой подборке — 18 проверенных промтов, которые помогут вам писать чистые, безопасные и легковесные образы.

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

Задача: Создать минимальный Dockerfile для FastAPI-приложения.
Промт: Напиши Dockerfile для FastAPI-приложения на Python 3.12. Используй официальный образ python:3.12-slim, установи зависимости из requirements.txt, скопируй код, запусти через uvicorn на порту 8000.
Результат:

FROM python:3.12-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]

2. Multi-stage сборка для Go

Задача: Уменьшить размер образа Go-приложения с 800 МБ до 20 МБ.
Промт: Создай multi-stage Dockerfile для Go-приложения. Первый этап — сборка с golang:1.22, второй — запуск из scratch. Скопируй только бинарник.
Результат:

FROM golang:1.22 AS builder
WORKDIR /app
COPY . .
RUN CGO_ENABLED=0 go build -o app .

FROM scratch
COPY --from=builder /app/app /
CMD ["/app"]

Размер образа уменьшается с ~800 МБ до ~15 МБ.

3. Оптимизация слоёв через объединение RUN

Задача: Объединить команды apt-get и pip в один RUN, чтобы снизить количество слоёв.
Промт: Добавь в Dockerfile установку системных пакетов libpq-dev и gcc, а затем Python-пакетов psycopg2. Все команды должны быть в одном RUN, с clean в конце.
Результат:

RUN apt-get update && apt-get install -y --no-install-recommends libpq-dev gcc \
    && pip install --no-cache-dir psycopg2-binary \
    && apt-get clean && rm -rf /var/lib/apt/lists/*

4. Использование .dockerignore для исключения node_modules

Задача: Избежать копирования лишних файлов в контексте сборки.
Промт: Создай .dockerignore для Node.js приложения, чтобы исключить node_modules, .git, .env, build-папки.
Результат:

node_modules
.git
.env
build
dist
*.md

Это ускоряет сборку в 2-4 раза для больших проектов.

5. Docker Compose для связки PostgreSQL + Redis

Задача: Развернуть локально сервисы FastAPI, PostgreSQL и Redis.
Промт: Напиши docker-compose.yml для сервисов: fastapi-app (сборка из Dockerfile), postgres:16, redis:7. Настрой volumes для БД, network bridge, переменные окружения через .env.
Результат:

version: '3.8'
services:
  app:
    build: .
    ports:
      - "8000:8000"
    env_file: .env
    depends_on:
      - db
      - redis
  db:
    image: postgres:16
    volumes:
      - pgdata:/var/lib/postgresql/data
    environment:
      POSTGRES_DB: myapp
      POSTGRES_USER: user
      POSTGRES_PASSWORD: ${DB_PASSWORD}
  redis:
    image: redis:7
    volumes:
      - redisdata:/data
volumes:
  pgdata:
  redisdata:

6. Healthcheck в Dockerfile

Задача: Добавить проверку работоспособности контейнера.
Промт: Добавь HEALTHCHECK в Dockerfile для Node.js Express-приложения. Проверяй GET /health каждые 30 секунд, таймаут 10 секунд, 3 ретрая.
Результат:

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

7. Установка non-root пользователя для безопасности

Задача: Запускать контейнер от непривилегированного пользователя.
Промт: Создай Dockerfile для Python-приложения, где добавлен пользователь appuser с uid 1000, и приложение запускается от него.
Результат:

FROM python:3.12-slim
RUN useradd -m -u 1000 appuser
WORKDIR /home/appuser
COPY --chown=appuser:appuser . .
USER appuser
CMD ["python", "app.py"]

8. Кэширование зависимостей с помощью --mount=type=cache

Задача: Ускорить повторные сборки за счёт кэширования pip-пакетов.
Промт: Используй BuildKit для кэширования pip install в Dockerfile. Добавь флаг --mount=type=cache.
Результат:

# syntax=docker/dockerfile:1.4
FROM python:3.12-slim
RUN --mount=type=cache,target=/root/.cache/pip \
    pip install -r requirements.txt

Сборка ускоряется на 40-60%.

9. Использование ARG и BUILD_ARG для динамических версий

Задача: Собирать образ с разными версиями базового образа.
Промт: Создай Dockerfile с ARG PYTHON_VERSION=3.12, который подставляется в FROM. Покажи пример сборки с другой версией.
Результат:

ARG PYTHON_VERSION=3.12
FROM python:${PYTHON_VERSION}-slim
...

Сборка: docker build --build-arg PYTHON_VERSION=3.11 -t myapp .

10. Docker Compose для разработки с hot-reload

Задача: Настроить live-reload для React-приложения в контейнере.
Промт: Напиши docker-compose.yml для React-приложения с volumes для кода, порт 3000, команда npm start с WATCHPACK_POLLING=true.
Результат:

services:
  frontend:
    build: .
    ports:
      - "3000:3000"
    volumes:
      - .:/app
      - /app/node_modules
    environment:
      - WATCHPACK_POLLING=true

11. Изоляция зависимостей через pip freeze

Задача: Сгенерировать точный список зависимостей для воспроизводимости.
Промт: Создай скрипт, который из виртуального окружения генерирует requirements.txt с точными версиями.
Результат: pip freeze > requirements.txt. Рекомендуется фиксировать версии в Dockerfile.

12. Сборка образа с проверкой уязвимостей через Trivy

Задача: Интегрировать сканирование безопасности в CI/CD.
Промт: Напиши команду для сканирования собранного образа myapp:latest с помощью Trivy. Выведи только критические уязвимости.
Результат: trivy image --severity CRITICAL myapp:latest. По данным Aqua Security (2023), 40% образов содержат хотя бы одну критическую уязвимость.

13. Лучшие практики: использование --no-cache-dir и --no-install-recommends

Задача: Минимизировать размер образа.
Промт: Добавь флаги --no-cache-dir для pip и --no-install-recommends для apt-get. Объясни, как это влияет на размер.
Результат: Экономия до 50-100 МБ на образ.

14. Docker Compose с профилями для dev/staging/prod

Задача: Разделить сервисы по окружениям.
Промт: Создай docker-compose.yml с профилями: dev (все сервисы), prod (только app + db). Используй profiles.
Результат:

services:
  app:
    image: myapp
    profiles: ["dev", "prod"]
  redis:
    image: redis:7
    profiles: ["dev"]

Запуск: docker compose --profile dev up.

15. Использование LABEL для метаданных образа

Задача: Добавить информацию о версии, maintainer и дате сборки.
Промт: Добавь LABEL с maintainer, версией, build-date в Dockerfile.
Результат:

LABEL maintainer="dev@asibiont.com" version="1.0.0" build-date="2026-07-16"

16. Оптимизация COPY через .dockerignore и многослойность

Задача: Копировать только нужные файлы поэтапно.
Промт: Раздели COPY на два этапа: сначала requirements.txt, потом остальной код. Объясни, почему это ускоряет инкрементальную сборку.
Результат: Кэш для зависимостей не сбрасывается при изменении кода.

17. Docker Compose с переменными окружения из .env

Задача: Передать секреты и настройки через env_file.
Промт: Настрой docker-compose.yml для чтения переменных из .env файла. Пример с DB_PASSWORD и API_KEY.
Результат: Используйте env_file: .env в сервисах.

18. Сборка образа для ARM-архитектуры (Apple Silicon)

Задача: Собрать образ для amd64 и arm64 одновременно.
Промт: Напиши команду для создания мультиархитектурного образа с помощью docker buildx. Платформы: linux/amd64, linux/arm64.
Результат: docker buildx build --platform linux/amd64,linux/arm64 -t myapp:latest --push .

Заключение

Эти 18 промтов охватывают ключевые аспекты работы с Docker: от базового Dockerfile до продвинутой оптимизации и мультиархитектурной сборки. Используйте их как шпаргалку при создании своих образов. Помните: лучший образ — тот, который минимален, безопасен и быстро собирается. Экспериментируйте с multi-stage сборками, кэшированием и non-root пользователями — это даст ощутимый прирост в производительности и безопасности.

← Все статьи

Комментарии