何らかの理由で、リモートデバッグをDocker内で実行されているSpring-Bootアプリに接続する際に問題が発生します。 Javaアプリを次のコマンドで起動します:
Java -Xdebug -Xrunjdwp:server=y,transport=dt_socket,address=8000,suspend=n -jar app.jar
Dockerの場合、docker-composeでこれらのポートを公開します。
ports:
- "8080:8080"
- "8000:8000"
ただし、デバッガーはポート8000で接続できません。サーバーをローカルで実行すると機能しますが、Docker内では機能しません。理由は何ですか?
Docker ps出力:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0d17e6851807 pocmanager_manager:latest "/bin/sh -c 'Java -D 3 seconds ago Up 2 seconds 0.0.0.0:8000->8000/tcp, 0.0.0.0:8080->8080/tcp pocmanager_manager_1
35ed2e2c32bc redis:latest "/entrypoint.sh redi 14 seconds ago Up 13 seconds 0.0.0.0:6379->6379/tcp pocmanager_redis_1
dockerFileでは、Exposeコマンドは作業の半分しか実行しないことを理解する必要があります。これは、Dockerの内部のポートのみを公開し、外部には公開しないことを意味します。この例では、結果は次のようになります。
デバッグはJava_OPTSおよびリモートデバッグで機能します。dockerFileは次のようになります。
FROM frolvlad/Alpine-oraclejdk8:slim
VOLUME /tmp
ADD gs-spring-boot-docker-0.1.0.jar app.jar
RUN sh -c 'touch /app.jar'
ENTRYPOINT [ "sh", "-c", "Java $Java_OPTS -jar /app.jar" ]
次のコマンドを実行します。
docker run -e "Java_OPTS=-agentlib:jdwp=transport=dt_socket,address=8000,server=y,suspend=y" -p 8080:8080 -p 8000:8000 -t springio/gs-spring-boot-docker
ご覧のとおり、私の場合(Eclipse)8000の場合、実行中にデバッグポートを公開する必要があります。
こんにちは私は同じ問題に直面しました。
Dockerfileのエントリポイントに以下を追加しました。
"-agentlib:jdwp = transport = dt_socket、address = 8000、server = y、suspend = n"
これで、次のようになります。
FROM Java:8
VOLUME /tmp
ADD realName*.jar app.jar
EXPOSE 4786
RUN sh -c 'touch /app.jar'
ENTRYPOINT
["Java","-agentlib:jdwp=transport=dt_socket,address=8000,server=y,suspend=n","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
DockerfileでExpose
port8000を実行しませんでした。
お役に立てれば。
これは、Virtual Box VM構成がデバッグポートをホストマシンにトンネリングしないためである可能性があります。
このリンクを確認してください https://github.com/boot2docker/boot2docker/blob/master/doc/WORKAROUNDS.md
基本的に、あなたの場合、プロンプトを実行して実行する必要があります
VBoxManage modifyvm "boot2docker-vm" --natpf1 "tcp-port8000,tcp,,8000,,8000";
注:VBoxManageがPATHに含まれていることを確認してください