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
相关产品推荐
相关产品推荐

