You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

VS Code中Docker化Django Web应用调试问题求助

问题描述

我通过YouTube视频和书籍自学Web开发,用VS Code构建了Docker容器化的Django Web应用(深知容器的诸多优势)。项目里已经开发了多个应用,但随着复杂度上升,调试定位错误变得非常困难。下面是我用到的Docker相关文件、task.json和launch.json代码:


Dockerfile
# For more information, please refer to https://aka.ms/vscode-docker-python
FROM python:3-slim

EXPOSE 8000
# Expose port for debugpy
EXPOSE 5678

# Keeps Python from generating .pyc files in the container
ENV PYTHONDONTWRITEBYTECODE=1

# Turns off buffering for easier container logging
ENV PYTHONUNBUFFERED=1

# Install debugpy for debugging
RUN python -m pip install debugpy

# Install pip requirements
COPY requirements.txt .
RUN python -m pip install -r requirements.txt

WORKDIR /app
COPY . /app

# Creates a non-root user with an explicit UID and adds permission to access the /app folder
# For more info, please refer to https://aka.ms/vscode-docker-python-configure-containers
RUN adduser -u 5678 --disabled-password --gecos "" appuser && chown -R appuser /app
USER appuser

# # During debugging, this entry point will be overridden. For more information, please refer to https://aka.ms/vscode-docker-python-debug
# CMD ["gunicorn", "--bind", "0.0.0.0:8000", "DRM_Inventory.wsgi"]

# Command to start Django with debugpy
CMD ["sh", "-c", "pip install debugpy -t /tmp && python /tmp/debugpy --wait-for-client --listen 0.0.0.0:5678 manage.py runserver 0.0.0.0:8000 --nothreading --noreload"]
docker-compose.yml
version: "3.9"
services:
  web:
    build: .
    command: python /DRM_Django_App/manage.py runserver 0.0.0.0:8000
    volumes:
      - .:/DRM_Django_App
    ports:
      - 8000:8000
    depends_on:
      - db
  db:
    image: postgres:13
    volumes:
      - postgres_data:/var/lib/postgresql/data/
    environment:
      - "POSTGRES_HOST_AUTH_METHOD=trust"
    ports:
      - "5432:5432" # Expose PostgreSQL default port for debugging
    command:
      [
        "postgres",
        "-c",
        "log_statement=all",
        "-c",
        "log_destination=stderr"
      ]
volumes:
  postgres_data:
docker-compose.debug.yml
version: '3.4'

services:
  drmdjangoapp:
    image: drmdjangoapp
    build:
      context: .
      dockerfile: ./Dockerfile
    command:
      [
        "sh",
        "-c",
        "pip install debugpy -t /tmp && python /tmp/debugpy --wait-for-client --listen 0.0.0.0:5678 manage.py runserver 0.0.0.0:8000 --nothreading --noreload"
      ]
    ports:
      - 8000:8000
      - 5678:5678
    volumes:
      - .:/app
    depends_on:
      - db

  db:
    image: postgres:13
    volumes:
      - postgres_data:/var/lib/postgresql/data/
    environment:
      - "POSTGRES_HOST_AUTH_METHOD=trust"
    ports:
      - "5432:5432"
volumes:
  postgres_data:
.vscode/task.json
{
    "version": "2.0.0",
    "tasks": [
        {
            "type": "docker-build",
            "label": "docker-build",
            "platform": "python",
            "dockerBuild": {
                "tag": "drmdjangoapp:latest",
                "dockerfile": "${workspaceFolder}/Dockerfile",
                "context": "${workspaceFolder}",
                "pull": true
            }
        },
        {
            "type": "docker-run",
            "label": "docker-run: debug",
            "dependsOn": [
                "docker-build"
            ],
            "dockerRun": {
                "env": {
                    "PYTHONUNBUFFERED": "1"
                },
                "ports": [
                    {
                        "containerPort": 8000,
                        "hostPort": 8000
                    },
                    {
                        "containerPort": 5678,
                        "hostPort": 5678
                    }
                ],
                "volumes": [
                    {
                        "containerPath": "/app",
                        "localPath": "${workspaceFolder}"
                    }
                ]
            }
        }
    ]
}
.vscode/launch.json
{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Docker: Python - Django",
            "type": "docker",
            "request": "launch",
            "preLaunchTask": "docker-run: debug",
            "python": {
                "pathMappings": [
                    {
                        "localRoot": "${workspaceFolder}",
                        "remoteRoot": "/app"
                    }
                ],
                "projectType": "django"
            }
        }
    ]
}

我试过删除所有这些文件,通过命令面板重新生成并参考视频修改配置,但问题还是没解决。希望能帮忙排查调试问题,找出配置里的遗漏或错误。


排查与修复要点

1. 统一容器内代码路径

Dockerfile中设置了WORKDIR /app,但docker-compose.yml的web服务挂载路径为/DRM_Django_App,启动命令也指向该路径,导致路径混乱。需统一为/app:

  • 修改docker-compose.yml中web服务的配置:
    command: python /app/manage.py runserver 0.0.0.0:8000
    volumes:
      - .:/app
    

2. 移除Debugpy重复安装

Dockerfile已通过RUN python -m pip install debugpy安装了debugpy,启动命令无需再次安装,直接使用已安装的版本:

  • 将Dockerfile和docker-compose.debug.yml中的启动命令改为:
    python -m debugpy --wait-for-client --listen 0.0.0.0:5678 manage.py runserver 0.0.0.0:8000 --nothreading --noreload
    

3. 解决权限匹配问题

Dockerfile创建的appuser UID为5678,挂载本地目录时可能因权限不匹配导致文件读写失败:

  • 临时注释Dockerfile中的USER appuser,用root用户启动容器测试调试是否正常;
  • 若正常,调整本地目录权限,使其匹配容器内appuser的UID:sudo chown -R 5678:5678 ./

4. 验证VS Code路径映射

确保launch.json中的remoteRoot: "/app"与容器内Django项目根目录完全一致,且manage.py确实在/app目录下,否则断点无法命中。

5. 统一调试启动方式

当前同时使用docker-run任务和docker-compose.debug.yml,易造成配置冲突,建议二选一:

  • 若用VS Code的docker-run任务,确保task.json中的volumes、ports配置与Dockerfile一致;
  • 若用docker-compose.debug.yml,修改launch.json为docker-compose类型:
    {
        "version": "0.2.0",
        "configurations": [
            {
                "name": "Docker Compose: Django",
                "type": "docker-compose",
                "request": "launch",
                "service": "drmdjangoapp",
                "dockerCompose": {
                    "file": "${workspaceFolder}/docker-compose.debug.yml"
                },
                "python": {
                    "pathMappings": [{"localRoot": "${workspaceFolder}", "remoteRoot": "/app"}],
                    "projectType": "django"
                }
            }
        ]
    }
    

6. 检查Django基础配置

  • 确保settings.py中DEBUG = True;
  • ALLOWED_HOSTS设置为["*"]或包含0.0.0.0,避免访问被拒绝。

内容的提问来源于stack exchange,提问作者Muhammad Ibtesam

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 02:27:05