[英]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.