Подключение Eclipse к контейнеру Docker для удаленной отладки

Я пытаюсь подключить eclipse к контейнеру докеров, который у меня запущен, но у меня возникают проблемы.

Моя команда запуска докера выглядит следующим образом:

docker run --rm -it -p 8000:8000 -p=8668:8080 -p 8010:8009 -p 8443:8443 \
--name myContainer -h theContainer -e JVM_ROUTE=myContainer1 myContainer:qa

В eclipse я подключаюсь к localhost в качестве хоста и 8000 в качестве порта. Я перехожу в Run-> Debug Configurations-> Remote Java Application, и я создал новую конфигурацию отладки.

Подключение Eclipse к контейнеру Docker для удаленной отладки

Когда я нажимаю "Применить", а затем "Отладка", я получаю всплывающее сообщение об ошибке Failed to connect to remote VM..

Подключение Eclipse к контейнеру Docker для удаленной отладки

Что еще мне нужно сделать, чтобы удаленная отладка работала правильно?

См. Также stackoverflow.com/questions/138511/…

Raedwald 02.05.2021 14:21
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
6
1
9 325
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Java-приложение, работающее в контейнере докеров, можно удаленно отлаживать с помощью

  1. Включение JDWP для java-процесса в контейнере, например

    java -Xdebug -Xrunjdwp:transport=dt_socket,address=8000,server=y,suspend=y [...]
    

    или используя переменную среды JAVA_OPTS

    JAVA_OPTS = "-Xdebug -Xrunjdwp:transport=dt_socket,address=8000,server=y,suspend=y"
    

    Обратите внимание, что suspend=y предотвратит запуск приложения до тех пор, пока к JVM не будет подключен удаленный отладчик. Если используется suspend=n, приложение запустится как обычно, позволяя удаленному отладчику подключиться позже.

  2. Подключение к процессу, например через вашу IDE, используя порт, указанный в настройках address=<port> выше, и, что важно, IP-адрес докер хост, который, если вы не работаете в Linux, вероятно, не localhost. Если вы используете docker-machine, IP-адрес хоста докера может отображаться с помощью docker-machine ip, например

    $ docker-machine ip
    192.168.99.100
    

Я на Mac. Я попробую сейчас.

aCarella 12.04.2018 16:28
Ответ принят как подходящий

Это было решено заменой localhost моим фактическим IP-адресом.

У меня Mac, поэтому я не использую docker-machine.

aCarella 18.04.2018 18:32

что вы имеете в виду, говоря, что я не использую docker-machine, эта проблема связана с docker-machine, и вы отправляете неправильный ответ! это актуально!

Dupinder Singh 09.09.2019 15:00

ОС: Ubuntu 18 / Windows 10

Java: OpenJdk 12

Контейнер Docker: Приложение загрузки Sprint

Чтобы подключить удаленную отладку в Eclipse, вы можете выполнить следующие действия:

  1. Поместите эти строки в Dockerfile вашего приложения

    # For Windows Machine comment EXPOSE 7074 and add it to docker-compose.yml
    EXPOSE 7074
    ENV DEBUG_INFO = "-Xdebug -Xrunjdwp:transport=dt_socket,address=0.0.0.0:7074,server=y,suspend=n"
    ENTRYPOINT [ "sh", "-c", "java ${DEBUG_INFO} -Dspring.profiles.active=docker -jar /pharmacy-service.jar" ]

Для Windows добавьте порты в docker-compose.yml


  bank-service:
    image: ....
    environment:
       ...
    ports:
      - 9097:9097
      - 7074:7074
  1. Только для Linux: запустите приложение docker и найдите сеть, в моем случае ecs-core_default
    $ docker network ls
    NETWORK ID          NAME                DRIVER              SCOPE
    e63bb0decc92        bridge              bridge              local
    94aefcdbb5f3        ecs-core_default    bridge              local
  1. Только для Linux: теперь проверьте IP-адрес своего приложения, используя:


    $ docker network inspect ecs-core_default
    [
        {
            "Name": "ecs-core_default",
            .....
            "IPAM": {
                "Driver": "default",
                "Options": null,
                "Config": [
                    {
                        "Subnet": "172.18.0.0/16",
                        "Gateway": "172.18.0.1"
                    }
                ]
            },
            .....
            "Containers": {
                "29bebdc31d6bf2057ed31074407c780cc718396ca49f58e766e098fceaa41a41": {
                    "Name": "ecs-core_pharmacy-service_1",
                    "EndpointID": "fadc9b40bfed1d4b2104b96fb6930bda47928256092c268aa4cb67407c2c1661",
                    "MacAddress": "02:42:ac:12:00:06",
                    "IPv4Address": "172.18.0.6/16",
                    "IPv6Address": ""
                }
            }
            .....
        }
    ]

  1. Только для Linux: скопируйте IP-адрес из контейнеров «IPv4Address»: «172.18.0.6/16», то есть 172.18.0.6.

  2. Только для Windows 10: чтобы найти IP, перейдите в Панель управления -> Сеть и Интернет -> Просмотр состояния сети и задачи -> Изменить настройки адаптера -> Найдите vEthernet. Откройте «Свойства», перейдите на вкладку «Сеть», выберите TCP / IPv4, затем нажмите кнопку «Свойства» и скопируйте IP. Windows Docker IPv4

  3. В Eclipse, Run -> Debug Configuration, используйте IP (снимок экрана показывает IPv4 для Linux, для Windows это будет 172.26.48.1) и открытый порт (например, 7074).

Наслаждаться!!

Другие вопросы по теме