не удается отладить приложение django в VS Code с базой данных докеров: «не удалось перевести имя хоста db на адрес: имя или служба не известны»

Мое приложение django подключается к базе данных 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 services). Я запускаю только контейнер db в докере, а не веб-сервис:

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

person 43Tesseracts    schedule 17.08.2019    source источник
comment
Как у тебя дела с контейнерами, docker-compose? Если это так, вам нужно опубликовать свой файл компоновки, потому что это похоже на настройку докера.   -  person markwalker_    schedule 18.08.2019
comment
добавлен материал для создания докеров   -  person 43Tesseracts    schedule 18.08.2019


Ответы (2)


Я думаю, что эта версия вашего файла компоновки докеров не поддерживает то, что вы хотите. Измените версию докера на 3.7, как показано ниже:

version: '3.7'
person N01    schedule 18.08.2019

Ну, вы не можете отлаживать внутри контейнера докеров, как это в коде VS. Для этого вам нужно запустить код VS изнутри контейнеров. Для этого вы можете выполнить следующие шаги:

Первый шаг: наличие подходящей среды Docker

Что ж, если у вас есть файл Dockerfile или файл docker-compose.yml, это очень круто. Если у вас его нет, тоже хорошо. В этом случае вы можете использовать образ Docker для создания среды Docker. К вашему сведению, если вы используете среду Docker на основе Alpine, вам необходимо использовать 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
  }
}

Четвертый шаг: установка пакета расширения для удаленной разработки

Установите пакет расширения Remote Development из VS Code. Market или используйте интегрированный рынок VS Code для его установки:

Последний шаг: запуск кода VS из контейнера

После установки в левом нижнем углу кода VS появится значок:

Теперь нажмите на это, и появится несколько вариантов:

Теперь нажмите Remote-Containers: Reopen Folder в опции «Контейнер», код VS перезагрузится. Теперь вы находитесь в среде Docker!!

Вы также можете создать отладчик и поместить точки останова в исходный код, чтобы увидеть, сработает ли он.

Дополнительную информацию можно найти в official documentation или вы можете проверьте также это blog.


если вы не находитесь внутри контейнера докера, ошибка 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, работающий на локальном компьютере, или открыть порты докера базы данных для доступа к нему.

person ruddra    schedule 18.08.2019
comment
Я ценю подробные инструкции (я действительно хочу это сделать!), Однако это не моя проблема в этом вопросе. Я запускаю службу db только в контейнере. Я хочу отлаживать проект django ВНЕШНИМ контейнером, как я могу сделать с ./src/manage.py runserver, у которого нет проблем с подключением к службе db. - person 43Tesseracts; 19.08.2019
comment
@43Tesseracts, пожалуйста, смотрите обновленный раздел ответа - person ruddra; 19.08.2019
comment
Спасибо. Я знаю, что контейнер db работает правильно, и порты открыты, и мой файл settings.py уже верен, потому что я могу без проблем подключиться к нему, запустив свое приложение только с ./manage.py runserver по какой-то причине конфигурация отладки не работает так же, но я не понимаю, что конфигурация отладки делает по-другому, что вызывает проблему. - person 43Tesseracts; 19.08.2019
comment
конфигурация отладки будет работать на вашем локальном компьютере, а не внутри контейнера - person ruddra; 19.08.2019
comment
Но почему это не работает, если я могу без проблем запустить свое приложение на своем локальном компьютере? - person 43Tesseracts; 19.08.2019
comment
Хорошо, я пробую разработку в контейнере, который работает нормально. Однако, когда я повторно открываю папку в контейнере, он запускает веб-службу в фоновом режиме, поэтому я не вижу вывод, как я делаю, когда я manage.py runserver сам локально. Кроме того, поскольку веб-порт уже используется, запуск конфигурации отладки также завершается ошибкой. Я пытаюсь остановить веб-службу (используя список контейнеров слева), но она просто перезагружается. хаха. Я знаю, что могу изменить порт отладки, но как остановить контейнер от запуска веб-службы? - person 43Tesseracts; 20.08.2019
comment
Я думаю, что теперь вы можете легко отлаживать vscode, у меня есть настройка приложения django с помощью cookie-cutter, затем я следую этому для настройки vscode: code.visualstudio.com/docs/containers/docker-compose. После запуска докера просто запустите, прикрепите - person Tran Quan; 12.04.2021