Отладка Tomcat в контейнере Docker

У меня есть CoreOS, работающий в Vagrant. Vagrant private network IP - 192.168.111.1. Внутри CoreOS находится контейнер-докер с Tomcat 8.0.32. Практически все работает нормально (развертывание приложений и т.д.), Просто отладки нет. Tomcat сопоставляется с портом 8080, а порт JPDA должен быть 8000.

Факты

Tomcat JPDA настроен на:

JDPA_OPTS -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=8000

Он начинается с команды catalina.sh jpda start. Вывод в консоли при запуске с docker-compose:

tomcat | Listening for transport dt_socket at address: 8000

Из информации о контейнере я предполагаю, что порты отображаются так, как они должны:

CONTAINER ID        IMAGE       COMMAND      CREATED             STATUS              PORTS                                            NAMES
dcae1e0148f8        tomcat      "/run.sh"    8 minutes ago       Up 8 minutes        0.0.0.0:8000->8000/tcp, 0.0.0.0:8080->8080/tcp   tomcat

Изображение моего докера основано на этом Dockerfile.

Проблема

При попытке запустить удаленную конфигурацию отладки (снимок экрана ниже) я получаю сообщение об ошибке Error running Debug: Unable to open debugger port (192.168.111.1:8000): java.net.ConnectException "Connection refused". Я пробовал все от изменения различной конфигурации, но не повезло. Я что-то пропустил?

введите описание изображения здесь

Ответ 1

Это команда, которую я использую для этого:

docker run -it --rm \
  -e JPDA_ADDRESS=8000 \
  -e JPDA_TRANSPORT=dt_socket \
  -p 8888:8080 \
  -p 9000:8000 \
  -v D:/tc/conf/tomcat-users.xml:/usr/local/tomcat/conf/tomcat-users.xml \
  tomcat:8.0 \
  /usr/local/tomcat/bin/catalina.sh jpda run

Объяснение

  • -e JPDA_ADDRESS = 8000
    порт отладки в контейнере, переданный как переменная среды
  • -e JPDA_TRANSPORT = dt_socket тип транспорта для отладки как сокет, переданный как переменная среды
  • -p 8888: 8080
    выложить порт tomcat 8080 на хост в качестве порта 8888
  • -p 9000: 8000
    вывести порт отладки java 8000 на хост в качестве порта 9000
  • -v {host-file}: {container-file}
    переписать tomcat-user.xml с моим локальным, поскольку мне нужен доступ к диспетчеру api и пропустить эту строку, если это не обязательно для вашего случая использования
  • tomcat: 8.0
    см. https://hub.docker.com/_/tomcat/
  • /usr/local/tomcat/bin/catalina.sh jpda запустить команду для запуска в контейнере

Ответ 2

Вы всегда можете обновить Dockerfile следующим образом: -

FROM tomcat:8-jre8
MAINTAINER me

ADD target/app.war /usr/local/tomcat/webapps/app.war

ENV JPDA_ADDRESS="8000"
ENV JPDA_TRANSPORT="dt_socket"

EXPOSE 8080 8000
ENTRYPOINT ["catalina.sh", "jpda", "run"]

Это означает, что по умолчанию ваш файл docker отлаживается, что, вероятно, не подходит для производственной среды.

Ответ 3

Попробуйте добавить в свой файл Dockerfile

ENV JPDA_ADDRESS=8000
ENV JPDA_TRANSPORT=dt_socket

Это работает для меня

Ответ 4

Я разрешил аналогичную, если не то же самое, проблему при использовании docker-compose.

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

См. проблему:

Ответ 5

Принятый ответ не работал для меня, по-видимому, потому что я использовал Java 11. Кажется, что если вы используете Java 9 или новее, вам нужно указать адрес JPDA следующим образом:

JPDA_ADDRESS=*:8100

Ответ 6

Вам необходимо убедиться, что порт 8080 открыт для подключения IntelliJ. То есть во время работы докера вам потребуется что-то вроде docker run -p 8080:8080

Например, я могу выполнить аналогичное требование, например, выполняя указанные ниже шаги/проверки.

Это то, что моя команда запуска docker выглядит так:

sudo docker run --privileged=true -d -p 63375:63375 -p 63372:8080 -v /tmp/:/usr/local/tomcat/webapps/config <container name>:<tag>

ПРИМЕЧАНИЕ. Я показываю дополнительный порт 63375 на контейнере и на моем хосте. Тот же порт, который я использую в CATALINA_OPTS ниже.

Вот как выглядит моя точка входа (для изображения, которое я создаю). ПРИМЕЧАНИЕ. Я использую CATALINA_OPTS. Кроме того, я использую maven для создания изображения, поэтому ниже выведено из pom.xml.

<entryPoint>
    <shell>cd /usr/local/tomcat/bin; CATALINA_OPTS="-agentlib:jdwp=transport=dt_socket,address=63375,server=y,suspend=n" catalina.sh run</shell>
</entryPoint>

Ответ 7

У меня есть аналогичная настройка в моей локальной среде. Я включил JPDA_ADDRESS в качестве переменной среды в файле Docker и воссоздал контейнеры.

ENV JPDA_ADDRESS 8000

#Expose port 8080, JMX port 13333 & Debug port 8000
EXPOSE 8080 13333 8000

CMD ["tail", "-f", "/dev/null"]  

Ответ 8

Для меня это чище:

docker run -e JAVA_TOOL_OPTIONS="-agentlib:jdwp=transport=dt_socket,address=8000,server=y,suspend=n" -p 8000:8000 tomcat:8.5-jdk8

Таким образом, вам не нужно изменять ваш контейнерный Dockerfile.

Объяснение: все версии Java проверяют переменную среды JAVA_TOOL_OPTIONS: https://docs.oracle.com/javase/8/docs/technotes/guides/troubleshoot/envvars002.html