Порт отображения между docker -compose и docker -compose.extend для среды разработки - PullRequest
0 голосов
/ 08 апреля 2020

У меня есть docker-compose, используемый для производства, который я надеюсь объединить с докернизированной средой разработки VS Code.

./docker-compose.yml

version: "3.6"
services:
  django: &django-base
    build:
      context: .
      dockerfile: backend/Dockerfile_local
    restart: on-failure
    volumes:
      - .:/website
    depends_on:
      - memcached
      - postgres
      - redis
    networks:
      - main
    ports:
      - 8000:8000 # HTTP port
      - 3000:3000 # ptvsd debugging port
    expose:
      - "3000"
    env_file:
      - variables/django_local.env
   ...

Обратите внимание, что я оба перенаправить и выставить порт 3000 здесь. Это результат того, что я играю, чтобы получить то, что мне нужно. Не уверен, что мне нужно одно или другое, или оба.

Мой ./devcontainer выглядит следующим образом:

./devcontainer/devcontainer.json

{
    "name": "Dev Container",

    "dockerComposeFile": ["../docker-compose.yml", "docker-compose.extend.yml"],

    "service": "dev",
    "workspaceFolder": "/workspace",
    "shutdownAction": "stopCompose",

    "settings": { 
        "terminal.integrated.shell.linux": null,
        "python.linting.pylintEnabled": true,
        "python.pythonPath": "/usr/local/bin/python3.8"
    },

    "extensions": [
        "ms-python.python"
    ]
}

.devcontainer/docker-compose.extended.yml

version: '3.6'
services:
  dev:
    build:
      context: .
      dockerfile: ./Dockerfile
    external_links:
      - django
    volumes:
      - .:/workspace:cached
    command: /bin/sh -c "while sleep 1000; do :; done"

Идея состоит в том, что я хочу иметь возможность запускать код VS, подключенный к службе dev, и оттуда я хочу запустить отладчик, подключенный к службе django, используя следующую команду launch.json config:

{
    "name": "WP",
    "type": "python",
    "request": "attach",
    "port": 3000,
    "host": "localhost",
    "pathMappings": [
        {
            "localRoot": "${workspaceFolder}",
            "remoteRoot": "/website"
        }
    ]
},

При этом я получаю сообщение об ошибке, где VS Code говорит connect ECONNREFUSED 127.0.0.1:3000. Как я могу получить сопоставленные порты, чтобы это работало? Это вообще возможно?

Редактировать

Почему бы просто не подключиться напрямую к сервису django?

Контейнер dev просто содержит python и время выполнения узла для linting и в целях интеллигенции при использовании VS Code. Идея создания нового сервиса, специально предназначенного для отладки в среде разработчиков, заключается в том, что ./docker-compose.yml содержит более нескольких сервисов, которые некоторые разработчики в моей команде иногда отключают, чтобы снизить потребление ресурсов. Создав контейнер специально для dev, он также упрощает настройку .devcontainer-devcontainer.json для добавления таких вещей, как расширения, в один контейнер без необходимости добавлять их после присоединения к работающему контейнеру «non-dev». Если бы это работало, VS Code работал бы внутри контейнера dev (см. this ).

1 Ответ

0 голосов
/ 08 апреля 2020

Мне удалось решить эту проблему, изменив хост в launch.json с localhost на host.docker.internal. Результирующая конфигурация launch.json выглядит следующим образом:

{
    "name": "WP",
    "type": "python",
    "request": "attach",
    "port": 3000,
    "host": "host.docker.internal",
    "pathMappings": [
        {
            "localRoot": "${workspaceFolder}",
            "remoteRoot": "/web-portal"
        }
    ]
},
...