在开发容器中进行VS Code Python Django调试

时间:2019-12-13 14:02:07

标签: python django debugging visual-studio-code

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

launch.json

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

manage.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服务器相同的容器内运行的,这使我认为我需要将ptvsd设置为运行在launch.json所在的本地端口(8001)上以下:

launch.json

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

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

1 个答案:

答案 0 :(得分: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连接到主机。可行!