メインコンテンツまでスキップ

Cursor Docker 開発:コンテナ化ワークフローを簡単に

Cursor Docker Development

Docker は一貫した開発環境に不可欠となり、Cursor の AI 機能により、コンテナの作業がより迅速で直感的になります。このガイドでは、Dockerfile の作成、Docker Compose オーケストレーション、Dev Containers、およびデバッグワークフローについて説明します。

前提条件​

開始する前に:

  • Docker がマシンにインストールされ、実行中であること
  • Cursor(最新バージョンを推奨)
  • Docker の基本概念(イメージ、コンテナ、ボリューム)の基礎知識

Cursor を使用した Dockerfile の作成​

本番環境対応 Dockerfile の生成​

アプリケーションスタックを説明し、Cursor に最適化された Dockerfile を生成させます:

Next.js 14 アプリケーション用のマルチステージ Dockerfile を作成してください:
- 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実行中のコンテナにシェルで入る
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 月