Введение
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 без воды.
Комментарии