Не удается отладить Websphere Application Server внутри контейнера Docker с помощью IntelliJ

#java #docker #intellij-idea #dockerfile #websphere-8

#java #docker #intellij-idea #dockerfile #websphere-8

Вопрос:

Я пытаюсь переместить WAS в контейнер и продолжаю иметь возможность отлаживать его. Это традиционная версия WAS 8.5.5.17. Я пробовал несколько способов, но не могу успешно подключить удаленный отладчик с помощью IntelliJ. WAS устанавливается в DebugMode при просмотре server.xml , но нет порта прослушивания. Свойства JVM, связанные с отладкой, задаются следующим образом:

 debugMode="true" debugArgs="-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=7777" genericJvmArguments=""
  

Докерфайл:

 FROM ibmcom/websphere-traditional:8.5.5.17

COPY db /work/config/db
COPY MQ /work/config/MQ
COPY earear /work/config/ear.ear
COPY custom_jvm_properties.txt /work/config/custom_jvm_properties.txt
COPY file.properties /work/config/file.properties
COPY Sscript.py /work/config/Script.py
COPY jars/work/config/jars
RUN mkdir -p /work/config/Folder

RUN /work/configure.sh

#ENV JAVA_TOOL_OPTIONS -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=7777
EXPOSE 80 9080 9448 9443 9060 9043 7777
  

Когда я создаю изображение, используя приведенный выше файл, контейнер создается, и приложение может быть запущено. Раскомментирование строки #ENV приводит к созданию образа, но запуск контейнера приводит к следующей ошибке:

 ERROR: transport error 202: bind failed: Address already in use
ERROR: JDWP Transport dt_socket failed to initialize, TRANSPORT_INIT(510)
JDWP exit error AGENT_ERROR_TRANSPORT_INIT(197): No transports initialized [debugInit.c:762]
  

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

 docker run -p 80:80 -p 9080:9080 -p 9448:9448 -p 9443:9443 -p 9060:9060 -p 9043:9043 -p 7777:7777 -v C:volume:/volume --name ContainerName image
  

Попытка передать JAVA_TOOL_OPTIONS в качестве переменной среды также не работает. На этом этапе я могу запустить сервер в режиме отладки, но у меня нет прослушивающих портов для подключения отладчика, или сервер не запускается с прослушивающими портами из-за вышеупомянутой ошибки.

Комментарии:

1. Что вы подразумеваете под «отсутствием прослушиваемых портов»? Отладчик никогда не подключается успешно, даже если открыт 7777: 7777? Envvar не должен быть необходимым, и я подозреваю, что это вызывает двойную привязку к порту 7777 с уже установленными аргументами отладки.

2. Интересно, можете ли вы подключиться с помощью jdb из самого контейнера в /opt/IBM/WebSphere/AppServer/java/bin: ./jdb -attach localhost:7777

Ответ №1:

Вместо предоставления параметров отладки с помощью

 #ENV JAVA_TOOL_OPTIONS -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=7777
  

Я полагаю, что рекомендуемой процедурой было бы поместить эти параметры отладки в файл свойств (debug.props) в:

 debugArgs="-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=7777"
  

Затем скопируйте в свой образ docker:

 COPY --chown=was:root debug.props /work/config/debug.props
  

Наконец, примените эту конфигурацию:

 RUN work/applyConfig.sh /work/config/debug.props
  

Смотрите Пример проекта здесь: https://github.com/WASdev/ci.docker.websphere-traditional/tree/10367b51ccbf489cd6e1655769b968e9d9bfca13/samples/batch-compute-grid

Комментарии:

1. Вверху они упомянули, что debugArgs устанавливаются в server.xml уже, так что я не думаю, что это будет иметь какой-то дополнительный эффект. Либо JVM не прослушивает, когда говорит, что это так, либо что-то в сети Docker мешает подключению отладчика.

Ответ №2:

Удалось выяснить это после игры с IntelliJ.

Я пытался следовать этому руководству https://blog.jetbrains.com/idea/2019/04/debug-your-java-applications-in-docker-using-intellij-idea /

Однако потребовалась дополнительная настройка. Мне пришлось настроить websphere image для сборки и настроить его на всегда запуск в режиме отладки (это может привести к дальнейшему замедлению, но это был обходной путь, который позволяет мне отлаживать и может быть удален при восстановлении образа). После этого я мог подключить удаленный отладчик только после полного запуска сервера. Не было запроса о том, что у сервера есть доступный порт для прослушивания, но он был. Использование опции «Запустить docker перед отладкой» приведет к сбою подключения. Спасибо за помощь!