【问题标题】:VS Code Python Django debugging in a dev containerVS Code Python Django 在开发容器中调试
【发布时间】:2020-04-06 23:54:22
【问题描述】:

我正在 Dockerized 容器中开发 Python Django 应用程序。我已成功设置远程调试以附加到容器内的 Django 服务器。我的配置如下。

launch.json

{
  "name": "Remote Django App",
  "type": "python",
  "request": "attach",
  "pathMappings": [
    {
      "localRoot": "${workspaceFolder}",
      "remoteRoot": "/app"
    }
  ],
  "port": 9001,
  "host": "localhost"
}

ma​​nage.py

#!/usr/bin/env python
"""Django's command-line utility for administrative tasks."""
import os
import sys


def main():
    os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'llf_api.settings')
    try:
        from django.core.management import execute_from_command_line
        from django.conf import settings

        if settings.DEBUG:
          if os.environ.get('RUN_MAIN') or os.environ.get('WERKZEUG_RUN_MAIN'):
              import ptvsd
              ptvsd.enable_attach(address=('0.0.0.0', 8001))
              print("Attached remote debugger")

    except ImportError as exc:
        raise ImportError(
            "Couldn't import Django. Are you sure it's installed and "
            "available on your PYTHONPATH environment variable? Did you "
            "forget to activate a virtual environment?"
        ) from exc
    execute_from_command_line(sys.argv)


if __name__ == '__main__':
    main()

docker-compose.yml

services:
  api:
    image: ${DOCKER_IMAGE_BASE}:${DOCKER_TAG}
    build:
      context: .
      dockerfile: ./Dockerfile.development
    env_file:
      - .env
    environment:
      - DATABASE_URL=postgres://username:password@db/db_name
    volumes:
      - .:/app
    command: >
      bash -c "wait-for-it --service db:5432
      && python3 manage.py runserver 0.0.0.0:8000"
    ports:
      - "9000:8000"
      - "9001:8001"
    depends_on:
      - db
    tty: true
    stdin_open: true

问题是我在dev container(上面的Dockerfile.development)内运行VS Code。所以 VS Code 本质上是在 Django 服务器运行的同一个容器中运行,这让我觉得我需要通过将我的 launch.json 设置为以下来附加到运行 ptvsd 的本地端口(8001):

launch.json

{
  "name": "Local Django App",
  "type": "python",
  "request": "attach",
  "host": "api",
  "port": 8001
}

但是这不起作用。当我尝试在 VS Code 中附加调试器时,它似乎最终会超时。有谁知道这是如何实现的?

【问题讨论】:

    标签: python django debugging visual-studio-code


    【解决方案1】:

    我对 VS Code 和我的服务器如何运行的理解本质上是错误的。服务器和 VS Code 运行的是同一个镜像,但不是同一个容器。容器并行运行,因此本地网络也不可用。

    为了完成这项工作,我意识到我需要 VS Code 容器通过主机上打开的调试端口访问服务器的容器。我知道如何做到这一点的唯一方法是使用docker.for.mac.localhost 作为主机。因此,我原来的设置需要改变的只是 launch.json 配置。

    launch.json

    {
      "name": "Remote Django App",
      "type": "python",
      "request": "attach",
      "pathMappings": [
        {
          "localRoot": "${workspaceFolder}",
          "remoteRoot": "/app"
        }
      ],
      "port": 9001,
      "host": "docker.for.mac.localhost"
    }
    

    VS Code 现在附加到已在主机上公开的端口 9001,并使用 docker.for.mac.localhost 连接到主机。有效!

    【讨论】:

    • 通过此设置,您可以在 python django 代码中设置断点并使用您在 linux 或 Windows 桌面上运行的 vscode 实例在这些断点处停止吗?
    • 你的意思是python中的breakpoint()吗?使用此设置,它只会在 VS Code 断点处中断,因为服务器本身会忽略 breakpoint() AFAIK。
    • 是的,我指的是在源代码的 vscode 视图中设置的断点,即软断点,而不是 python breakpoint(),即硬断点。
    • fyi,使用 wintel 设置的读者可能想知道“Intel(R) Graphics Command Center Service”服务停放在 tcp/9001 上,因此您需要进入服务和如果您想使用该远程连接端口进行调试,请将其设置为手动或禁用
    • 看看code.visualstudio.com/docs/remote/containers。至于为什么,对于 Python,它规避了使用虚拟环境并手动安装基本依赖集,因为它们是从用于服务 web api 的 Docker 容器中获取的。然而,它有它自己的取舍。
    猜你喜欢
    • 2021-03-17
    • 2021-11-12
    • 1970-01-01
    • 2020-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-16
    相关资源
    最近更新 更多