跳到主要内容

Cursor Docker 开发:容器化工作流变得简单

Cursor Docker Development

Docker 已成为一致开发环境的必需品,而 Cursor 的 AI 能力使容器工作更快、更直观。本指南涵盖 Dockerfile 创建、Docker Compose 编排、Dev Containers 和调试工作流。

前置条件​

在开始之前:

  • Docker 已安装并在您的机器上运行
  • Cursor(建议使用最新版本)
  • 对 Docker 概念(镜像、容器、卷)有基本了解

使用 Cursor 创建 Dockerfile​

生成生产就绪的 Dockerfile​

描述您的应用堆栈,让 Cursor 生成优化的 Dockerfile:

创建一个多阶段 Dockerfile,用于 Next.js 14 应用:
- 使用 Node.js 20 Alpine
- 使用 npm ci 安装依赖
- 构建生产包
- 以非 root 用户运行
- 使用最小化的最终镜像

Cursor 生成:

# 构建阶段
FROM node:20-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build

# 生产阶段
FROM node:20-alpine AS runner
WORKDIR /app
ENV NODE_ENV=production

# 创建非 root 用户
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"]

优化现有 Dockerfile​

粘贴您的 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 挂载源代码,但使用 - /app/node_modules 排除 node_modules。这防止容器和主机 node_modules 冲突。

Cursor 中的 Dev Containers​

设置 .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"
}

Dev Container Docker Compose​

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. 在 Cursor 中按 F1
  2. 选择 Dev Containers: Reopen in Container
  3. Cursor 将构建容器并在其中重新打开工作区
首次构建

初始容器构建可能需要几分钟。后续重建使用 Docker 缓存,速度快得多。

在容器内调试​

Node.js 调试​

添加到您的 Docker Compose:

services:
app:
build: .
ports:
- "3000:3000"
- "9229:9229" # 调试端口
command: node --inspect=0.0.0.0:9229 index.js

配置 Cursor launch.json:

{
"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 工作流​

构建和运行​

# 构建镜像
docker build -t myapp:latest .

# 运行容器
docker run -p 3000:3000 --env-file .env myapp:latest

# 使用卷挂载运行
docker run -p 3000:3000 -v $(pwd):/app myapp:latest

数据库迁移​

# 在容器中运行迁移
docker-compose exec app npx prisma migrate deploy

# 种子数据库
docker-compose exec app npx prisma db seed

查看日志​

# 跟踪所有日志
docker-compose logs -f

# 特定服务
docker-compose logs -f app

# 最后 100 行
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 建议检查主机端口可用性并修改端口映射。

权限问题​

卷权限问题的常见修复:

# 添加到 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

AI 驱动的 Dockerfile 审查​

让 Cursor 审计您的设置:

审查此 Docker 设置:
1. 安全最佳实践
2. 镜像大小优化
3. 构建缓存效率
4. 正确的信号处理(PID 1)
5. 健康检查

相关资源​

最后更新:2025 年 7 月