Если вы работаете с 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-инструментам.
Комментарии