繁体   English   中英

在 docker 中调试 spring-boot

[英]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
  • 远程 JVM 的命令行参数:
    -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005
  • 使用模块类路径: some-api.main

调试

  • 使用docker-compose up运行应用程序
  • 然后通过 IntelliJ IDEA 进行调试

输出

连接目标VM,地址:'localhost:5005',传输:'socket'

环境

  • macOS 大苏尔 11.5.2
  • IntelliJ IDEA CE 2021.2.1
  • Docker 版本 3.6.0 (3.6.0.5487)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM