إنتقل إلى المحتوى الرئيسي

تطوير Docker باستخدام Cursor: تبسيط سير العمل المعتمد على الحاويات

Cursor Docker Development

أصبح Docker ضروريًا لبيئات التطوير المتسقة، ويمكن لقدرات الذكاء الاصطناعي في Cursor جعل العمل مع الحاويات أسرع وأكثر بديهية. يغطي هذا الدليل إنشاء Dockerfile وتنسيق Docker Compose وDev Containers وسير عمل التصحيح.

المتطلبات الأساسية​

قبل البدء، ستحتاج إلى:

  • Docker مثبتًا ويعمل على جهازك
  • Cursor (الإصدار الأحدث موصى به)
  • فهم أساسي لمفاهيم Docker (الصور والحاويات والمجلدات)

إنشاء Dockerfiles باستخدام Cursor​

Dockerfile للإنتاج​

صف مكدس تطبيقك ودع Cursor يُنشئ Dockerfile مُحسَّنًا:

أنشئ Dockerfile متعدد المراحل لتطبيق Next.js 14 يتضمن:
- Node.js 20 Alpine
- تثبيت التبعيات باستخدام npm ci
- بناء حزمة الإنتاج
- التشغيل كمستخدم غير جذري
- صورة نهائية صغيرة

النتيجة التي أنشأها Cursor:

# Build stage
FROM node:20-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build

# Production stage
FROM node:20-alpine AS runner
WORKDIR /app
ENV NODE_ENV=production

# Create non-root user
RUN addgroup --system --gid 1001 nodejs
RUN adduser --system --uid 1001 nextjs

COPY --from=builder /app/public ./public
COPY --from=builder --chown=nextjs:nodejs /app/.next/standalone ./
COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static

USER nextjs
EXPOSE 3000
ENV PORT=3000
ENV HOSTNAME="0.0.0.0"

CMD ["node", "server.js"]

تحسين Dockerfiles الحالية​

الصق Dockerfile واطلب التحسينات:

حسّن هذا Dockerfile لبناء أسرع وحجم صورة أصغر:
[الصق Dockerfile]

التحسينات الشائعة التي يقترحها Cursor:

  • دمج أوامر RUN لتقليل الطبقات
  • استخدام .dockerignore لتقليل السياق
  • الاستفادة الفعالة من ذاكرة التخزين المؤقت للبناء
  • استخدام علامات صور أساسية محددة بدلاً من latest

أفضل ممارسات .dockerignore​

node_modules
npm-debug.log
Dockerfile
.dockerignore
.git
.gitignore
README.md
.env
.env.local
.env.production
.nyc_output
coverage
.vscode
.idea

مكدس التطوير مع Docker Compose​

إعداد التطبيق الكامل​

version: '3.8'
services:
app:
build:
context: .
dockerfile: Dockerfile
ports:
- "3000:3000"
environment:
- DATABASE_URL=postgresql://user:pass@db:5432/myapp
- REDIS_URL=redis://redis:6379
volumes:
- .:/app
- /app/node_modules
depends_on:
- db
- redis

db:
image: postgres:16-alpine
environment:
POSTGRES_USER: user
POSTGRES_PASSWORD: pass
POSTGRES_DB: myapp
ports:
- "5432:5432"
volumes:
- postgres_data:/var/lib/postgresql/data

redis:
image: redis:7-alpine
ports:
- "6379:6379"

nginx:
image: nginx:alpine
ports:
- "80:80"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf:ro
depends_on:
- app

volumes:
postgres_data:

إعداد إعادة التحميل السريع​

بيئة تطوير مع إعادة تحميل مباشرة:

services:
dev:
build:
context: .
target: builder
command: npm run dev
ports:
- "3000:3000"
volumes:
- .:/app
- /app/node_modules
environment:
- CHOKIDAR_USEPOLLING=true
- WATCHPACK_POLLING=true
خدعة المجلدات

قم بتحميل كود المصدر باستخدام - .:/app، لكن استبعد node_modules باستخدام - /app/node_modules. يمنع هذا تعارض node_modules بين الحاوية والمضيف.

Dev Containers في Cursor​

إعداد .devcontainer​

أنشئ .devcontainer/devcontainer.json:

{
"name": "Node.js & PostgreSQL",
"dockerComposeFile": "docker-compose.yml",
"service": "app",
"workspaceFolder": "/workspace",
"features": {
"ghcr.io/devcontainers/features/node:1": {
"version": "20"
},
"ghcr.io/devcontainers/features/git:1": {}
},
"customizations": {
"vscode": {
"extensions": [
"Prisma.prisma",
"esbenp.prettier-vscode",
"dbaeumer.vscode-eslint"
],
"settings": {
"terminal.integrated.defaultProfile.linux": "bash"
}
}
},
"postCreateCommand": "npm install",
"forwardPorts": [3000, 5432],
"remoteUser": "node"
}

Docker Compose لـ Dev Container​

version: '3.8'
services:
app:
image: mcr.microsoft.com/devcontainers/javascript-node:20
volumes:
- ..:/workspace:cached
command: sleep infinity
network_mode: service:db

db:
image: postgres:16-alpine
environment:
POSTGRES_USER: dev
POSTGRES_PASSWORD: dev
POSTGRES_DB: workspace
volumes:
- postgres-data:/var/lib/postgresql/data

volumes:
postgres-data:

فتح في Dev Container​

  1. اضغط على F1 في Cursor
  2. حدد Dev Containers: Reopen in Container
  3. سيقوم Cursor ببناء الحاوية وإعادة فتح مساحة العمل داخلها
البناء الأول

قد يستغرق البناء الأولي للحاوية بضع دقائق. ستستخدم عمليات إعادة البناء اللاحقة ذاكرة التخزين المؤقت لـ Docker وتكون أسرع بكثير.

التصحيح داخل الحاويات​

تصحيح Node.js​

أضف إلى Docker Compose:

services:
app:
build: .
ports:
- "3000:3000"
- "9229:9229" # Debug port
command: node --inspect=0.0.0.0:9229 index.js

تكوين launch.json في Cursor:

{
"version": "0.2.0",
"configurations": [
{
"name": "Docker: Attach to Node",
"type": "node",
"request": "attach",
"port": 9229,
"address": "localhost",
"localRoot": "${workspaceFolder}",
"remoteRoot": "/app",
"skipFiles": ["<node_internals>/**"]
}
]
}

تصحيح Python داخل الحاوية​

FROM python:3.11-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
EXPOSE 8000
CMD ["python", "-m", "debugpy", "--listen", "0.0.0.0:5678", "--wait-for-client", "app.py"]

سير عمل Docker الشائعة​

البناء والتشغيل​

# Build image
docker build -t myapp:latest .

# Run container
docker run -p 3000:3000 --env-file .env myapp:latest

# Run with volume mount
docker run -p 3000:3000 -v $(pwd):/app myapp:latest

ترحيلات قاعدة البيانات​

# Run migrations in container
docker-compose exec app npx prisma migrate deploy

# Seed database
docker-compose exec app npx prisma db seed

عرض السجلات​

# Follow all logs
docker-compose logs -f

# Specific service
docker-compose logs -f app

# Last 100 lines
docker-compose logs --tail=100 app

مرجع سريع لأوامر Docker​

الأمرالوصف
docker psعرض الحاويات قيد التشغيل
docker imagesعرض الصور المحلية
docker-compose up -dبدء الخدمات في الخلفية
docker-compose downإيقاف وإزالة الحاويات
docker-compose buildإعادة بناء الصور
docker exec -it <container> shالوصول إلى shell لحاوية قيد التشغيل
docker logs -f <container>متابعة سجلات الحاوية
docker system pruneتنظيف الموارد غير المستخدمة

حل المشكلات باستخدام Cursor​

الحاوية لا تبدأ​

شارك Dockerfile وسجلات الخطأ:

تنهار هذه الحاوية فورًا برمز 1. الـ Dockerfile والسجلات هما:
[الصق المحتوى]

تعارض المنافذ​

Error: bind EADDRINUSE :::3000

سيتحقق Cursor من توفر منافذ المضيف ويقترح تعديل تعيين المنافذ.

مشاكل الأذونات​

إصلاح شائع لمشاكل أذونات المجلدات:

# Add to Dockerfile
RUN chown -R node:node /app
USER node

إعداد بيئات متعددة​

project/
docker/
Dockerfile.dev
Dockerfile.prod
docker-compose.yml
docker-compose.prod.yml
docker-compose.override.yml

Compose للإنتاج​

version: '3.8'
services:
app:
build:
context: ..
dockerfile: docker/Dockerfile.prod
restart: always
deploy:
replicas: 3
resources:
limits:
cpus: '1'
memory: 512M

مراجعة Dockerfile بالذكاء الاصطناعي​

اطلب من Cursor تدقيق إعدادك:

راجع إعداد Docker هذا من حيث:
1. أفضل ممارسات الأمان
2. تحسين حجم الصورة
3. كفاءة ذاكرة التخزين المؤقت للبناء
4. معالجة الإشارات المناسبة (PID 1)
5. فحوصات الصحة

موارد ذات صلة​

آخر تحديث: يوليو 2025