К основному содержанию
правило

docker · sanjeed5 — правило для Cursor: что делает и как установить

Правило настраивает Cursor для создания Dockerfile и docker-compose файлов с многоэтапной сборкой и запуском без root-прав.

Установить в Cursor · Вручную: положить файлы Все способы и платформы ↓
.cursor/rules/docker.mdc
Открыть на GitHub

Что делает docker

Правило активируется в Cursor при редактировании файлов по маскам **/Dockerfile и **/docker-compose*.{yml,yaml}. Оно заставляет модель выбирать компактные базовые образы Alpine и изолировать сборочные зависимости через multi-stage builds. Вспомогательные файлы обязательно отсекаются через .dockerignore.

Инструкция требует разделять переменные ARG для стадии сборки и ENV для рантайма, а также настраивать директиву HEALTHCHECK. Приложения внутри контейнеров должны писать логи в stdout и stderr. Запуск процессов разрешён только под непривилегированным пользователем через директиву USER.

Без файла .dockerignore сборка затянет лишние каталоги вроде node_modules и сломает кеш слоёв. В манифестах docker-compose.yml правило запрещает держать открытые пароли в секции environment, требуя выносить их в механизм secrets.

Какие задачи решает

  • переписать Dockerfile на многоэтапную сборку
  • настроить запуск приложения от непривилегированного пользователя
  • ускорить сборку за счёт правильного порядка инструкций кеша
  • добавить директиву HEALTHCHECK для проверки доступности сервиса

Примеры запросов агенту

  • Напиши production Dockerfile для сервиса на Node.js с разделением сборки и запуска
  • Добавь директиву HEALTHCHECK и настрой запуск от пользователя node
  • Собери docker-compose.yml для веб-приложения и PostgreSQL без открытых паролей

Как установить docker

Вручную: положить файлы

.cursor/rules/docker.mdc

Во frontmatter: description, globs, alwaysApply

По шагам, с командами для каждой платформы: Cursor rules: файлы .mdc, четыре режима и замена .cursorrules

Вопросы о docker

Как установить правило docker в Cursor?

Создайте файл .cursor/rules/docker.mdc в корне проекта и сохраните в него текст правила.

К каким файлам Cursor применяет правило docker?

Редактор подключает правило автоматически при открытии любых файлов по шаблонам **/Dockerfile и **/docker-compose*.{yml,yaml}.

В чём разница между ARG и ENV по этому правилу?

Директива ARG задаёт переменные исключительно для этапа сборки и не попадает в итоговый образ, а ENV объявляет переменные окружения для работающего приложения.

Исходный текст

docker.mdc · CC0-1.0
---
description: Definitive guidelines for writing efficient, secure, and maintainable Dockerfiles and Docker Compose configurations, ensuring fast builds and reliable deployments.
globs: **/Dockerfile,**/docker-compose*.{yml,yaml}
---
# docker Best Practices

Docker is the cornerstone of modern container-first development. Treat your `Dockerfile` and `docker-compose.yml` as critical source code. These rules ensure your images are fast, secure, reproducible, and aligned with modern DevOps practices.

## 1. Optimize for Multi-Stage Builds

Always use multi-stage builds. This pattern isolates build-time dependencies from runtime, drastically reducing final image size and attack surface.

❌ BAD: Single-stage build with all dependencies
```dockerfile
FROM node:20
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build
CMD ["node", "dist/server.js"]
```

✅ GOOD: Multi-stage build for production
```dockerfile
# Stage 1: Build application artifacts
FROM node:20-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production # Install only production dependencies for build
COPY . .
RUN npm run build

# Stage 2: Create minimal runtime image
FROM node:20-alpine
WORKDIR /app
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/node_modules ./node_modules # Copy only necessary runtime modules
USER node # Run as non-root user
EXPOSE 3000
CMD ["node", "dist/server.js"]
```

## 2. Choose Minimal, Trusted Base Images

Start with the smallest possible base image from a trusted source (Docker Official Images, Verified Publishers). Alpine variants are often the best choice for minimal footprints.

❌ BAD: Large, generic base image
```dockerfile
FROM ubuntu:latest # Too large, many unnecessary packages and vulnerabilities
```

✅ GOOD: Minimal, specific base image
```dockerfile
FROM node:20-alpine # Official, small, specific to Node.js
# Or for static content:
FROM nginx:alpine
```

## 3. Leverage `.dockerignore`

Always use a `.dockerignore` file to exclude irrelevant files and directories from your build context. This significantly speeds up builds and prevents sensitive or unnecessary files from being copied into the image.

❌ BAD: No `.dockerignore` (sends `node_modules`, `.git`, `.env`, etc., to the daemon)

✅ GOOD: Comprehensive `.dockerignore`
```
# .dockerignore
.git
.gitignore
node_modules
npm-debug.log
Dockerfile
docker-compose*.yml
.env
README.md
tmp/
```

## 4. Optimize Layer Caching

Order your `Dockerfile` instructions from least to most frequently changing. Docker caches layers, so placing stable instructions first maximizes cache hits and speeds up subsequent builds.

❌ BAD: Copying all source code before installing dependencies
```dockerfile
FROM node:20-alpine
WORKDIR /app
COPY . . # Invalidates cache if any file changes, forcing npm install every time
RUN npm install
```

✅ GOOD: Copying dependency files first
```dockerfile
FROM node:20-alpine
WORKDIR /app
COPY package*.json ./ # Only changes when dependencies change; cache hit if unchanged
RUN npm ci # Cache hit if package.json is unchanged
COPY . . # Only invalidates this layer if source code changes
```

## 5. Run as a Non-Root User

Never run your application as `root` inside the container. Create a dedicated non-root user and switch to it using the `USER` instruction to enforce the principle of least privilege.

❌ BAD: Running as root (default behavior)
```dockerfile
FROM node:20-alpine
WORKDIR /app
COPY . .
RUN npm install
CMD ["node", "app.js"] # Runs as root
```

✅ GOOD: Running as a non-root user
```dockerfile
FROM node:20-alpine
WORKDIR /app
COPY . .
RUN npm install && \
    chown -R node:node /app # Ensure non-root user has permissions for app directory
USER node # Switch to non-root user
CMD ["node", "app.js"]
```

## 6. Distinguish `ARG` and `ENV`

Use `ARG` for build-time variables that do not persist in the final image. Use `ENV` for runtime environment variables that your application needs.

❌ BAD: Using `ENV` for build-only values or `ARG` for runtime values
```dockerfile
FROM ubuntu
ENV BUILD_VERSION=1.0.0 # Persists in image, potentially unnecessary
ARG PORT=8080 # Not available at runtime unless explicitly passed
```

✅ GOOD: Correct usage of `ARG` and `ENV`
```dockerfile
FROM node:20-alpine
ARG NODE_ENV=production # Build-time variable, not in final image
ENV APP_PORT=3000 # Runtime variable, available to the application
WORKDIR /app
COPY . .
RUN if [ "$NODE_ENV" = "production" ]; then npm ci --production; else npm ci; fi
EXPOSE ${APP_PORT}
CMD ["node", "app.js"]
```

## 7. Implement Health Checks

Define `HEALTHCHECK` instructions in your `Dockerfile` to allow Docker and orchestration tools to verify if your containerized service is still working correctly. This is crucial for reliable deployments.

❌ BAD: No health check, relying solely on process exit
```dockerfile
CMD ["node", "app.js"]
```

✅ GOOD: Robust health check
```dockerfile
EXPOSE 3000
HEALTHCHECK --interval=30s --timeout=10s --start-period=5s --retries=3 \
    CMD curl -f http://localhost:3000/health || exit 1
CMD ["node", "app.js"]
```

## 8. Log to `stdout`/`stderr`

Containerized applications must write logs to `stdout` and `stderr`. This allows Docker and orchestration tools to easily capture, aggregate, and manage logs without needing complex in-container log rotation or file access.

❌ BAD: Writing logs to files inside the container
```javascript
// app.js
fs.appendFileSync('/var/log/app.log', 'Application started\n');
```

✅ GOOD: Writing logs to `stdout`/`stderr`
```javascript
// app.js
console.log('Application started');
console.error('An error occurred');
```

## 9. Use Docker Compose for Local Development

For multi-service applications, always use `docker-compose.yml` to define and run your services. This ensures a consistent, reproducible development environment for all team members.

❌ BAD: Manually running multiple `docker run` commands for interconnected services
```bash
docker run -p 8080:80 my-web-app
docker run -p 5432:5432 my-database
```

✅ GOOD: Defining services in `docker-compose.yml`
```yaml
# docker-compose.yml
version: '3.8'
services:
  web:
    build: .
    ports:
      - "8080:8080"
    environment:
      DATABASE_URL: postgres://user:password@db:5432/mydb
    depends_on:
      - db
  db:
    image: postgres:13-alpine
    environment:
      POSTGRES_DB: mydb
      POSTGRES_USER: user
      POSTGRES_PASSWORD: password
    volumes:
      - db_data:/var/lib/postgresql/data

volumes:
  db_data:
```

## 10. Manage Secrets Securely with Docker Compose

Never hardcode sensitive information (API keys, passwords) directly in `Dockerfile` or `docker-compose.yml`. For local development, use Docker Compose's `secrets` feature.

❌ BAD: Hardcoding secrets directly in the compose file
```yaml
# docker-compose.yml
services:
  web:
    environment:
      API_KEY: "supersecretkey123" # BAD! This is committed to source control.
```

✅ GOOD: Using Docker Compose secrets
```yaml
# docker-compose.yml
version: '3.8'
services:
  web:
    image: my-web-app:latest
    secrets:
      - api_key_file
    environment:
      API_KEY_PATH: /run/secrets/api_key_file # Application reads from this path

secrets:
  api_key_file:
    file: ./secrets/api_key.txt # Create this file locally, ensure it's .gitignored
```
*(Note: For production, use a dedicated secret management system like Kubernetes Secrets, AWS Secrets Manager, or HashiCorp Vault.)*

© sanjeed5 · CC0-1.0 · sanjeed5/awesome-cursor-rules-mdc

Похожие правила IDE

Все правила IDE по теме «DevOps и инфраструктура» →

Сначала — docker от других авторов.

docker PatrickJS Набор инструкций для Cursor по сборке безопасных production-образов Docker. Помогает писать чистые Dockerfile и docker-compose без root-доступа и лишних слоёв. ★ 41 028звёзд репо docker-development Alireza Rezvani Скилл анализирует Dockerfile, Docker Compose и контейнеры: ищет проблемы с размером, сборкой и безопасностью. Подойдёт для настройки контейнеризации. 702установок containerization-docker-best-practices официальный github Задаёт стандарты сборки Docker-образов: изолирует процессы, уменьшает размер с помощью multi-stage сборок и фиксирует неизменяемость контейнеров. ★ 40 478звёзд репо docker-project-foundations docker Скилл настраивает первичное окружение Docker для нового проекта. Он сразу создаёт базовую тройку файлов: .dockerignore, Dockerfile и compose.yaml. CX Codex +1 1 000установок bun-docker secondsky Скилл подсказывает, как собрать Dockerfile и docker-compose для приложения на Bun: официальные образы oven/bun, многоэтапные сборки, hot reload. CX Codex +1 408установок docker-expert PCL Team Скилл для работы с Docker: подсказывает, как собирать образы, чинить Dockerfile и настраивать Compose. Пригодится, когда контейнер раздулся или падает на старте. CX Codex +1 365установок docker-build-strategies docker Скилл учит ИИ-ассистента писать, проверять и оптимизировать Dockerfile по практикам BuildKit. Пригодится при медленной сборке или раздутом итоговом образе. CX Codex +1 1 200установок

Из того же набора240

Весь набор →
electron Правило для Cursor задаёт команде единый стиль разработки на Electron: контекстная изоляция, безопасный contextBridge, IPC через invoke и кросс-платформенные пути. ★ 3 580звёзд репо elasticsearch Инструкция по работе с Elasticsearch в Cursor: учит модель настраивать маппинги, фильтровать запросы через filter и дробить шарды. ★ 3 580звёзд репо duckdb Правило задаёт стиль и практики для DuckDB SQL: от CTE и настроек сессии до загрузки данных и индексов. Пригодится при написании и рефакторинге аналитических запросов. ★ 3 580звёзд репо drizzle Правило задаёт агенту Cursor стиль работы с Drizzle ORM: модульные схемы, явные ограничения полей и единый нейминг в TypeScript-проекте. ★ 3 580звёзд репо django Правило задаёт структуру проекта, организацию кода и паттерны безопасности для Django-приложений в Cursor. ★ 3 580звёзд репо django-rest-framework Правило Cursor, которое задаёт агенту единый стиль разработки API на Django REST Framework: структура проекта, сериализаторы, ViewSets. ★ 3 580звёзд репо django-orm Набор инструкций для Cursor по работе с Django ORM. Помогает структурировать модели и убирать проблему N+1 в запросах к базе. ★ 3 580звёзд репо discord-api Правило помогает писать Discord-приложения с REST-запросами, типами API и обработкой интеракций. Пригодится при разработке бота на TypeScript. ★ 3 580звёзд репо

Спонсоры проекта

Компании, которые помогают держать аналитику открытой