Skip to main content

将使用 Postgres 和 Redis 的 Django 应用 Docker 化

Devin 编写一个多阶段 Dockerfile 和一个包含 Django、PostgreSQL 与 Redis 的 docker-compose.yml,然后构建并运行整套服务以验证其可用性。
AuthorCognition
CategoryFeature Development
1

(可选)使用 Ask Devin 规划项目范围

如果你不确定你的 Django 应用依赖哪些服务,或者项目结构如何,可以先使用 Ask Devin 来了解情况:你也可以直接从 Ask Devin 发起 Devin 会话,它会把之前获取的全部信息作为上下文继续使用。
2

将你的 Django 项目和依赖项交给 Devin

将 Devin 指向需要容器化的 Django 项目,并说明任何特定要求——例如基础镜像偏好、应用依赖的服务或镜像大小限制。Devin 会读取你的 requirements.txtpyproject.toml 来推断其余内容。
3

Devin 调研并构建

Devin 读取你的 Django 项目及依赖文件以理解构建流程,并据此创建 Docker 配置:
  1. 读取依赖文件 — 解析 requirements.txtpyproject.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 worker,并配置健康检查、数据卷和共享网络
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. 验证应用 — 通过 curl 调用 /api/health/ 来确认 Django 能正常无误地启动、连接到 PostgreSQL,并访问 Redis
4

通过斜杠命令引导会话

在会话期间使用斜杠命令来引导 Devin 的工作流程:
  • /plan — 让 Devin 在编写任何 Docker 配置之前先给出实现方案概要。审查该方案并提出修改建议。
  • /test — 告诉 Devin 重新构建并重新验证容器栈。每次更改后使用此命令以尽早发现问题。
  • /review — 让 Devin 在打开 PR 之前审查自己的 Dockerfile 和 Compose 配置,检查安全问题、镜像大小以及最佳实践。
5

验证和迭代

一旦 Devin 提交 PR(pull request 拉取请求),审查生成的文件。常见的后续跟进示例:
6

使用 Devin Review 审查该 PR

一旦 Devin 创建 PR,使用 Devin Review 来审查 Docker 配置。Devin Review 可以发现安全问题(以 root 用户身份运行、暴露的机密信息)、缺失的最佳实践(没有 .dockerignore、没有健康检查),以及与你现有基础设施不一致的地方。