我正在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中附加调试器时,它似乎最终超时。有人知道如何实现吗?
答案 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
连接到主机。可行!