web-dev-qa-db-ja.com

DockerコンテナーでのTomcatのデバッグ

VagrantでCoreOSを実行しています。 VagrantプライベートネットワークIPは192.168.111.1です。 CoreOS内には、Tomcat 8.0.32を備えたdockerコンテナがあります。ほぼすべてが正常に機能します(アプリの展開など)だけではデバッグできません。 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
_

私のdockerイメージはこれに基づいています Dockerfile

問題

リモートデバッグ構成を実行しようとすると(下のスクリーンショット)、エラーError running Debug: Unable to open debugger port (192.168.111.1:8000): Java.net.ConnectException "Connection refused"が表示されます。さまざまな構成の変更からすべてを試しましたが、運はありません。何か不足していますか?

enter image description here

19
CAPS LOCK

これは私がこれに使用するコマンドです:

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
    expose Javaポート9000としてホストのポート8000​​をデバッグ
  • -v {Host-file}:{container-file}
    Tomcat-user.xmlをローカルのonで上書きします。マネージャーAPIにアクセスする必要があるためです。
    ユースケースに必要ない場合は、この行を省略してください
  • Tomcat:8.0
    を参照してください https://hub.docker.com/_/Tomcat/
  • / usr/local/Tomcat/bin/catalina.sh jpda run
    コンテナで実行するコマンド
27
Peter

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ファイルがデフォルトでデバッグをオンにしていることを意味しますが、これはおそらく実稼働環境には適していません。

7
bobmarksie

Dockerfileに追加してみてください

ENV JPDA_ADDRESS=8000
ENV JPDA_TRANSPORT=dt_socket

わたしにはできる

3
Bukharov Sergey

明らかにJava 11を使用していたため、受け入れられた答えは私にはうまくいきませんでした。Java 9以降を使用している場合、JPDAアドレスを次のように指定する必要があります。

JPDA_ADDRESS=*:8100
2
Clive Bixby

Docker-composeを使用する場合、同じではないにしても、同様の問題を解決しました。

環境変数がdocker-compose.ymlファイルから適切に渡されていませんでした。

スタックオーバーフローの問題を参照してください:

1
Olmstov

ポート8080が接続のためにIntelliJに公開されていることを確認する必要があります。つまり、dockerの実行中は、docker run -p 8080:8080

たとえば、以下の手順/チェックを行うことで、このような同様の要件を達成できます。

これは私のdocker runコマンドのようです:

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>
0
Tyagi Akhilesh

私にとってはこのようにきれいです:

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

0
Joan

ローカル環境でも同様の設定をしています。 JPDA_ADDRESSを環境変数としてDockerfileに含め、コンテナーを再作成しました。

ENV JPDA_ADDRESS 8000

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

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