调试泊坞窗中的弹簧启动

2022-09-02 10:09:15

由于某种原因,我在将远程调试连接到在 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 output:

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

答案 1

我必须意识到,在dockerFile中,Expose命令只做一半的工作,这意味着只公开docker内部的端口,而不是外部的端口,在你的示例中,结果将是这样的:

enter image description here

调试与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

enter image description here

enter image description here


答案 2

嗨,我遇到了同样的问题。

我将以下内容添加到 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中移植8000。Expose

希望这有帮助。


推荐