无法使用docker数据库在VS Code中调试django应用程序:“无法将主机名“ db”转换为地址:名称或服务未知”

时间:2019-08-17 22:43:50

标签: django docker visual-studio-code vscode-debugger

我的django应用正在连接到在docker容器中运行的postgreSQL数据库。

如果我在本地计算机上手动运行该应用程序,则可以毫无问题地连接到该容器:

./src/manage.py runserver

但是,如果我尝试通过VS Code运行调试配置,则会收到此错误:

psycopg2.OperationalError: could not translate host name "db" to address: Name or service not known

尽管db容器在那里,docker logs db返回了它的信息

这是我尝试调试时VSCode运行的代码(我没有设置任何这些设置):

/home/me/Developer/myproject/venv/bin/python /home/me/.vscode/extensions/ms-python.python-2019.8.30787/pythonFiles/ptvsd_launcher.py --default --client --host localhost --port 37153 /home/me/Developer/myproject/src/manage.py runserver --noreload 

如何使调试配置正常工作?这是VSCode生成的配置:

{
    "name": "Python: Django",
    "type": "python",
    "request": "launch",
    "program": "${workspaceFolder}/src/manage.py",
    "args": [
        "runserver",
        "--noreload"
    ],
    "django": true
},

编辑:db容器与docker-compose up db运行 这是我的 docker-compose.yml (为简单起见,我删除了redis,celery和beat服务)。我仅在docker中运行db容器,而不在Web服务中运行:

version: '2' # supported by default install on Ubuntu 18.04

services:
  db:
    image: postgres:9.5-alpine # Production server is using 9.5.17
    env_file: .env
    volumes:
      - postgres_data:/var/lib/postgresql/data/
  web:
    build: . # current directory
    env_file: .env
    command: bash -c "python /app/src/manage.py migrate && 
                      python /app/src/manage.py runserver 0.0.0.0:8000"
    volumes: 
      - .:/app
    ports:
      - "8000:8000"
    depends_on:
      - db

volumes:
  postgres_data:

还有一个 docker-compose.override.yml

version: '2'

services:

  db:
    ports:
      - 5432:5432

.env

POSTGRES_HOST=db

2 个答案:

答案 0 :(得分:0)

我认为此版本的docker compose文件不支持您想要的文件。将您的docker版本更改为3.7,如下所示:

version: '3.7'

答案 1 :(得分:0)

好吧,您无法在VS代码中像这样在docker容器中进行调试。为此,您需要从容器内部运行VS代码。为此,您可以按照以下步骤操作:

第一步:拥有合适的Docker环境

好吧,如果您有Dockerfile或docker-compose.yml文件,那就太酷了。如果您没有,那也可以。在这种情况下,您可以使用Docker Image构建Docker环境。仅供参考,如果您使用的是基于Alpine的Docker环境,则需要使用VS Code Insiders Edition。

第二步:创建.devcontainer文件夹

在此步骤中,您需要在源目录中创建一个名为.devcontainer的新文件夹。在其中创建一个devcontainer.json文件。

第三步:配置devcontainer.json

如果您使用的是docker-compose,则可以使用以下代码:

{
  "name": "Python 3",
  "context": "..",
  "dockerComposeFile": ["../docker-compose.yml"], // You need to point it your `docker-compose.yml` file with proper path.
  // Uncomment the next line if you want to publish any ports.
  "appPort": 8000,

  // Uncomment the next line to run commands after the container is created.
  // "postCreateCommand": "python --version",
  "service": "web", // You must define which service you are going to use from docker compose.
  "workspaceFolder": "/app", // path to your source inside docker file
  "extensions": [
    // extensions which is going to be installed inside the docker environment
    "ms-python.python",

  ],
  "settings": {
    // additional settings for VS Code configurations
    // You can copy paste them from `settings.json` of your workspace
    // Reference: https://code.visualstudio.com/docs/getstarted/settings#_settings-file-locations
    "python.pythonPath": "/usr/local/bin/python",
    "python.linting.pylintEnabled": true,
    "python.linting.enabled": true
  }
}

第四步:安装远程开发扩展包

从VS Code Market安装Remote Development扩展包,或使用VS Code的集成市场进行安装:

最后一步:从容器运行VS代码

安装后,VS Code的左下方将显示一个图标:

现在,单击该按钮,将显示如下几个选项:

现在单击“容器”选项中的Remote-Containers: Reopen Folder,VS代码将重新加载。现在,您位于Docker环境中!

您还可以创建一个调试器,并在源代码中放置断点以查看其是否命中。

可以在official documentation中找到更多信息,或者也可以检出此blog


除非您在docker容器中,否则错误psycopg2.OperationalError: could not translate host name "db" to address: Name or service not known将无法解决。仍然,如果您打算在本地计算机上进行调试,则可以利用环境变量,如下所示:

DATABASES = {
    'default': {
        'ENGINE': '...',
        'NAME': os.environ.get('db_name'),
        'USER': os.environ.get('user'),
        'PASSWORD': os.environ.get('password'),
        'HOST': os.environ.get('host'),
        'PORT': '3306',
    },
}

您需要确保您在本地计算机上运行了一个postgresql或公开了数据库docker端口来访问它。