[英]debug spring-boot in docker
出于某种原因,我在将远程调试连接到在 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
端口 8000。
希望这可以帮助。
我认为原因可能是,您的 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 中
对我来说,仅仅在地址命令行参数中指定调试端口是不够的。 我还需要通过在端口前加上*:
前缀来通配所有 ip 地址:
java -agentlib:jdwp=transport=dt_socket,address=*:8000,server=y,suspend=n -jar spring-app.jar
我在连接到使用 Docker Compose 运行的 Spring Boot 应用程序时遇到问题,并使用以下设置解决了它:
项目结构
- project
- some-api
- src
- Dockerfile
- build.gradle
- docker-compose.yml
项目/docker-compose.yml
version: "3.9"
services:
api:
image: rbento/some-api
build:
context: ./some-api
dockerfile: Dockerfile
container_name: api
ports:
- 8080:8080
- 5005:5005
项目/一些 API/Dockerfile
FROM adoptopenjdk/openjdk11:ubi
COPY build/libs/some-api-1.0.0.jar api.jar
ENTRYPOINT ["java","-agentlib:jdwp=transport=dt_socket,address=*:5005,server=y,suspend=n","-Djava.security.egd=file:/dev/./urandom","-jar","/api.jar"]
智能创意
创建一个Remote JVM Debug
配置,如下所示:
some-api-debug
Attach to remote JVM
localhost
5005
-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005
some-api.main
调试
docker-compose up
运行应用程序输出
连接目标VM,地址:'localhost:5005',传输:'socket'
环境
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.