Skip to main content

Postgres と Redis を使って Django アプリを Docker 化する

Devin がマルチステージ Dockerfile と、Django・PostgreSQL・Redis を含む docker-compose.yml を作成し、そのスタックをビルドして実行し、動作を検証します。
AuthorCognition
Category機能開発
1

(任意)Ask Devin でプロジェクトのスコープを決める

Django アプリがどのサービスに依存しているかや、プロジェクト構成が分からない場合は、まず Ask Devin を使って調査してください。Ask Devin から直接 Devin セッションを開始することもでき、その場合は Ask Devin で取得した情報がコンテキストとしてすべて引き継がれます。
2

Devin に Django プロジェクトと requirements ファイルを渡す

Devin にコンテナ化したい Django プロジェクトを指定し、ベースイメージの希望、アプリが依存しているサービス、イメージサイズの制約など、特別な要件があれば伝えてください。Devin は requirements.txtpyproject.toml を読み取り、残りを把握します。
3

Devin は調査し、構築します

Devin は Django プロジェクトと依存関係ファイルを読み取り、ビルドプロセスを把握したうえで、Docker 用の設定を作成します:
  1. 依存関係ファイルを読むrequirements.txt または pyproject.toml を解析し、Django、psycopg2、redis、celery、gunicorn を特定します
  2. Dockerfile を作成する — 依存関係をインストールするビルダーステージと、その仮想環境を最小限の python:3.12-slim ランタイムイメージにコピーするステージから成るマルチステージビルドを作成します
# ---- ビルダー ----
FROM python:3.12-slim AS builder
WORKDIR /app
COPY requirements.txt .
RUN python -m venv /opt/venv \
    && /opt/venv/bin/pip install --no-cache-dir -r requirements.txt

# ---- ランタイム ----
FROM python:3.12-slim
RUN groupadd -r django && useradd -r -g django django
COPY --from=builder /opt/venv /opt/venv
ENV PATH="/opt/venv/bin:$PATH"
WORKDIR /app
COPY src/ .
RUN python manage.py collectstatic --noinput
EXPOSE 8000
USER django
CMD ["gunicorn", "config.wsgi:application", "--bind", "0.0.0.0:8000", "--workers", "3"]
  1. docker-compose.yml を作成 — Django、PostgreSQL、Redis、Celery ワーカーを追加し、ヘルスチェック、ボリューム、共有ネットワークを設定します
services:
  web:
    build: .
    ports:
      - "8000:8000"
    env_file: .env
    depends_on:
      db:
        condition: service_healthy
      redis:
        condition: service_healthy
    healthcheck:
      test: ["CMD", "python", "-c", "import urllib.request; urllib.request.urlopen('http://localhost:8000/api/health/')"]
      interval: 10s
      retries: 3

  db:
    image: postgres:16-alpine
    environment:
      POSTGRES_DB: app_db
      POSTGRES_USER: app_user
      POSTGRES_PASSWORD: app_pass
    volumes:
      - pgdata:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U app_user -d app_db"]
      interval: 5s
      retries: 5

  redis:
    image: redis:7-alpine
    healthcheck:
      test: ["CMD", "redis-cli", "ping"]
      interval: 5s
      retries: 5

  celery:
    build: .
    command: celery -A config worker -l info
    env_file: .env
    depends_on:
      db:
        condition: service_healthy
      redis:
        condition: service_healthy

volumes:
  pgdata:
  1. .dockerignore を追加 — ビルドコンテキストに含める必要のないファイルを除外します(__pycache__.gittests/docs/*.pyc
  2. docker compose up --build を実行 — イメージをビルドし、Devin のターミナルですべてのサービスを起動します
  3. アプリを検証/api/health/ に対して curl コマンドを実行し、Django がクリーンに起動し、PostgreSQL に接続し、Redis にも接続できることを確認します
4

スラッシュコマンドでセッションを制御する

セッション中にスラッシュコマンドを使って、Devin のワークフローの進め方を調整します。
  • /plan — Devin に、Docker の設定を書く前に進め方を整理して説明するよう依頼します。計画を確認し、必要に応じて修正案を提案してください。
  • /test — Devin にコンテナー スタックを再ビルドして再検証するよう指示します。問題を早期に発見するため、変更のたびにこれを使ってください。
  • /review — Devin に、自身の Dockerfile と Compose 設定について、セキュリティ上の問題、イメージサイズ、およびベストプラクティスの観点から、PR を作成する前にレビューするよう依頼します。
5

検証と反復

Devin が PR を作成したら、生成されたファイルをレビューしてください。よくあるフォローアップの例:
6

Devin Review を使用して PR をレビューする

Devin が PR を作成したら、Devin Review を使って Docker の設定をレビューします。Devin Review は、セキュリティ上の問題(root での実行、シークレットの露出)、ベストプラクティスが守られていない点(.dockerignore がない、ヘルスチェックがない)、既存のインフラとの不整合を検知できます。