簡體   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