15 промтов для Docker: от Dockerfile до multi-stage сборок

Если вы работаете с Docker, то знаете, как много времени может уйти на написание правильного Dockerfile или настройку docker-compose.yml. Чтобы ускорить процесс и сделать контейнеры эффективнее, мы собрали 15 готовых промтов — от базовых шаблонов до продвинутых техник оптимизации. Каждый промт сопровождается пояснением и примером использования. Вы можете копировать их прямо в свой проект.

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

Задача: Быстро создать Dockerfile для типичного Python-приложения с зависимостями.

Промт:

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

Пример использования: Поместите этот код в файл Dockerfile в корне вашего проекта. Замените app.py на точку входа. Образ собирается командой docker build -t my-app ..

2. Multi-stage сборка для Go-приложения

Задача: Минимизировать размер образа Go-приложения с помощью multi-stage.

Промт:

# 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 GOOS=linux go build -o /app ./cmd/main.go

# Stage 2: final
FROM alpine:3.19
RUN apk --no-cache add ca-certificates
COPY --from=builder /app /app
CMD ["/app"]

Пример использования: Такой подход даёт образ размером около 10–20 МБ, в то время как образ с полным Go SDK может весить 500+ МБ. Подробнее — документация Docker multi-stage.

3. Оптимизация размера образа с Alpine и очисткой

Задача: Максимально уменьшить размер образа для любого приложения.

Промт:

FROM alpine:3.19
RUN apk add --no-cache --virtual .build-deps build-base \
    && pip install --no-cache-dir -r requirements.txt \
    && apk del .build-deps
COPY . .
CMD ["python", "app.py"]

Пример использования: Здесь мы сначала устанавливаем зависимости, потом сразу удаляем их, чтобы не оставались лишние пакеты. Это снижает размер на 20–40%.

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

Задача: Запустить веб-сервис и PostgreSQL в одной сети с помощью одного файла.

Промт:

version: '3.9'
services:
  web:
    build: .
    ports:
      - "8000:8000"
    depends_on:
      db:
        condition: service_healthy
    environment:
      DATABASE_URL: postgres://user:pass@db:5432/mydb
  db:
    image: postgres:16-alpine
    environment:
      POSTGRES_USER: user
      POSTGRES_PASSWORD: pass
      POSTGRES_DB: mydb
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U user -d mydb"]
      interval: 5s
      timeout: 3s
      retries: 5
    volumes:
      - pgdata:/var/lib/postgresql/data
volumes:
  pgdata:

Пример использования: Запустите docker compose up -d. Оба контейнера будут доступны по именам сервисов. Подробнее — compose specification.

5. Healthcheck для сервиса

Задача: Добавить проверку здоровья в контейнер, чтобы оркестратор понимал, жив ли сервис.

Промт:

FROM node:20-alpine
COPY . .
EXPOSE 3000
HEALTHCHECK --interval=30s --timeout=3s --retries=3 \
  CMD wget --no-verbose --tries=1 --spider http://localhost:3000/health || exit 1
CMD ["node", "server.js"]

Пример использования: Добавьте этот блок в Dockerfile или в сервис compose. При падении healthcheck Docker будет перезапускать контейнер.

6. .dockerignore — что не копировать

Задача: Исключить ненужные файлы из контекста сборки.

Промт:

git/
__pycache__/
*.md
.env
.DS_Store
dist/
node_modules/

Пример использования: Создайте файл .dockerignore в корне проекта. Он работает аналогично .gitignore. Это ускоряет сборку и уменьшает образ.

7. Правильный порядок инструкций для кэширования

Задача: Максимально задействовать кэш Docker.

Промт:

FROM python:3.11-slim
WORKDIR /app
# Сначала копируем только requirements и устанавливаем зависимости
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
# Только потом копируем исходники
COPY . .
CMD ["python", "app.py"]

Пример использования: Если вы часто меняете код, но редко обновляете зависимости, такой порядок позволяет переиспользовать закэшированный слой с pip install. Читайте здесь.

8. Запуск контейнера с ограничением ресурсов

Задача: Установить лимиты CPU и памяти для контейнера.

Промт:

docker run -d --name my-app \
  --memory="512m" \
  --cpus="1.5" \
  --restart=unless-stopped \
  my-image:latest

Пример использования: Такой запуск не даст контейнеру использовать больше 512 МБ ОЗУ и более 1,5 ядер CPU. Это полезно на shared-серверах.

9. Использование volumes и bind mounts

Задача: Сохранить данные вне контейнера и пробросить файлы на хост.

Промт (volumes):

services:
  app:
    image: nginx:alpine
    volumes:
      - app-data:/usr/share/nginx/html
volumes:
  app-data:

Промт (bind mount):

docker run -v /host/path:/container/path my-image

Пример использования: Bind mount удобен для разработки — изменения на хосте сразу видны в контейнере. Volumes управляются Docker и быстрее работают в продакшене.

10. Сеть: bridge и overlay

Задача: Изолировать контейнеры и организовать связь между ними.

Промт (создание bridge сети):

docker network create my-bridge

Промт (запуск в этой сети):

docker run -d --network=my-bridge --name app1 my-image
docker run -d --network=my-bridge --name app2 my-image

Пример использования: Контейнеры app1 и app2 могут общаться по именам. Для Swarm используйте docker network create --driver overlay my-overlay.

11. Docker Stack для деплоя в Swarm

Задача: Развернуть приложение с помощью Docker Swarm.

Промт:

version: '3.9'
services:
  web:
    image: my-web:latest
    deploy:
      replicas: 3
      resources:
        limits:
          memory: 256M
    ports:
      - "80:80"

Команда:

docker stack deploy -c docker-compose.yml my-stack

Пример использования: Подходит для небольшой кластеризации. Управление через docker stack проще, чем Kubernetes.

12. Секреты в Docker

Задача: Передать чувствительные данные (пароли, ключи) без хранения в образе.

Промт (для Swarm):

echo "my-secret-password" | docker secret create db_password -

Промт (в compose):

services:
  app:
    image: my-app
    secrets:
      - db_password
secrets:
  db_password:
    external: true

Пример использования: Секреты монтируются в /run/secrets/db_password. Не попадают в слои образа.

13. Логирование в JSON-файл

Задача: Настроить форматированный вывод логов.

Промт:

docker run --log-driver json-file --log-opt max-size=10m --log-opt max-file=3 my-app

Пример использования: Docker будет хранить логи как JSON, ротация — 3 файла по 10 МБ. Можно потом отправлять в ELK. Подробнее — документация.

14. Безопасность: запуск от non-root пользователя

Задача: Запускать процесс в контейнере не от root.

Промт:

FROM node:20-alpine
RUN addgroup -g 1001 -S appgroup && adduser -u 1001 -S appuser -G appgroup
COPY --chown=appuser:appgroup . .
USER appuser
EXPOSE 3000
CMD ["node", "server.js"]

Пример использования: Это снижает риски при компрометации контейнера. Пользователь с UID 1001 не имеет прав на установку пакетов.

15. Тестирование образа на уязвимости

Задача: Проверить образ на известные CVE.

Промт (с помощью docker scout):

docker scout quickview my-image:latest
docker scout cves my-image:latest

Пример (с Trivy):

trivy image my-image:latest

Пример использования: Регулярно сканируйте образы. docker scout встроен в Docker Desktop. Trivy — opensource-утилита от Aqua Security.

Заключение

Мы собрали 15 промтов, которые помогут вам быстрее и безопаснее работать с Docker — от написания Dockerfile до развёртывания в Swarm. Используйте их как шпаргалку, адаптируйте под свои проекты. Подписывайтесь на блог Asibiont, чтобы получать больше практических гайдов по DevOps и AI-инструментам.

← Все статьи

Комментарии