Не удается отладить при использовании `docker-compose run`, но` docker-compose up` работает - PullRequest
0 голосов
/ 06 октября 2018

Я могу создать тестовое репо, если это необходимо.Но суть этой проблемы в том, что я могу отладить образ Docker, созданный docker-compose, когда я использую команду up.Я НЕ могу отлаживать тот же контейнер при использовании команды run.В обоих случаях я вижу запуск моего приложения.Отладчик vs-кода, похоже, просто не может подключиться к контейнеру Docker при использовании docker-compose run.

Это похоже на мою рабочую задачу запуска в vs-коде (к которой может подключаться отладчик):

{
  "type": "node",
  "request": "launch",
  "name": "Docker: Debug",
  "runtimeExecutable": "docker-compose",
  "runtimeArgs": [
    "up"
  ],
  "port": 9229,
  "stopOnEntry": true,
  "restart": true,
  "timeout": 30000,
  "localRoot": "${workspaceRoot}",
  "remoteRoot": "/app",
  "outFiles": [ "${workspaceRoot}/dist/**/*.js" ],
  "console": "externalTerminal",
  "internalConsoleOptions": "neverOpen",
  "protocol": "inspector",
  "showAsyncStacks": true
}

Мой файл docker-compose также указывает здесь команду (npm run start-app, например), где start-app имеет следующее определение:

nodemon --legacy-watch --watch ./dist/app1 --inspect=0.0.0.0:9229 --nolazy ./dist/app1/index.js

Почему у меня естьпроблема:

Я не хочу указывать команду в файле docker-compose.yml, потому что у меня одно изображение с несколькими процессами внутри.(Будет один контейнер на процесс, но все они будут использовать один и тот же образ.) В настоящее время у меня это работает для развертывания kubernetes и запуска / отладки локальной разработки.Я хотел бы запустить и отладить в контейнере, запустив контейнер с указанной командой.

Я хочу иметь возможность запустить контейнер и указать, какое приложение запускать в моем коде против launch.jsonфайл, аналогичный приведенному ниже:

{
  "type": "node",
  "request": "launch",
  "name": "Docker: Debug",
  "runtimeExecutable": "docker-compose",
  "runtimeArgs": [
        "run",
        "all",
        "npm",
        "run",
        "start-app"
  ],
  "port": 9229,
  "stopOnEntry": true,
  "restart": true,
  "timeout": 30000,
  "localRoot": "${workspaceRoot}",
  "remoteRoot": "/app",
  "outFiles": [ "${workspaceRoot}/dist/**/*.js" ],
  "console": "externalTerminal",
  "internalConsoleOptions": "neverOpen",
  "protocol": "inspector",
  "showAsyncStacks": true
}

К вашему сведению, all в списке аргументов относится к названию моей службы в файле docker-compose.yml.

1 Ответ

0 голосов
/ 09 октября 2018

Коллега нашел следующий фрагмент в документации для docker-compose run:

... команда docker-compose run не создает ни один из портов, указанных в конфигурации службы.Это предотвращает конфликты портов с уже открытыми портами.Если вы хотите, чтобы порты службы создавались и отображались на хосте, укажите флаг --service-ports

Поэтому я изменил свои аргументы для задачи запуска, чтобы включить этот флаг, и теперь онработает.

"runtimeArgs": [
    "run",
    "--service-ports",
    "all",
    "npm",
    "run",
    "start-app"
],

Для повторного уточнения --service-ports говорит docker compose, чтобы он учитывал мои сопоставления портов в файле docker-compose.yml, что по умолчанию выполняет команда up.all - это имя моей службы в файле docker-compose.yml, а остальная часть команды - npm run start-app, где start-app - мой пользовательский скрипт в файле package.json.

...