programing

도커에서 debug spring-boot

bestprogram 2023. 6. 26. 21:29

도커에서 debug spring-boot

어떤 이유로 도커 내부에서 실행되는 스프링 부트 앱에 원격 디버그를 연결하는 데 문제가 있습니다.다음을 사용하여 Java 앱을 시작합니다.

java -Xdebug -Xrunjdwp:server=y,transport=dt_socket,address=8000,suspend=n -jar app.jar

도커의 경우 도커의 포트를 노출합니다.

ports:
- "8080:8080"
- "8000:8000"

그러나 디버거는 포트 8000에서 연결할 수 없습니다.도커 내부가 아닌 로컬에서 서버를 실행할 때 작동합니다.왜 그런지 추측이라도?

도커 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에서 Exposure 명령은 작업의 절반만 수행하며, 이는 외부가 아닌 도커 내부의 포트만 노출한다는 것을 의미합니다. 예에서 결과는 다음과 같습니다.

enter image description here

디버그는 JAVA_OPTS 및 원격 디버그와 함께 작동하며 도커 파일은 다음과 같습니다.

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

보시다시피 실행 중에 디버그 포트를 노출해야 합니다. 제 경우(이클립스) 8000

enter image description here

enter image description here

안녕하세요 저도 같은 문제에 직면했습니다.

도커 파일의 진입점에 다음을 추가했습니다.

"-agentlib:jdwp=sys=dt_sys, 주소=8000, server=y, syslog=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"]

안 했어요ExposeDocker 파일의 포트 8000.

이게 도움이 되길 바랍니다.

주소 명령줄 매개 변수 내에서 디버그 포트를 지정하는 것만으로는 충분하지 않았습니다.또한 포트 앞에 다음을 추가하여 모든 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        

project/computer-computer.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/도커 파일

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"]

인텔리제이 IDEA

작성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 Big Sur 11.5.2
  • IntelliJ IDEA CE 2021.2.1
  • 도커 버전 3.6.0(3.6.0.5487)

Virtual Box VM 구성이 디버그 포트를 호스트 시스템에 터널링하지 않기 때문일 수 있습니다.

링크를 확인하십시오. https://github.com/boot2docker/boot2docker/blob/master/doc/WORKAROUNDS.md

기본적으로, 당신의 경우, 당신은 프롬프트를 명령하고 실행해야 합니다.

VBoxManage modifyvm "boot2docker-vm" --natpf1 "tcp-port8000,tcp,,8000,,8000";

참고: VBoxManage가 경로에 있는지 확인합니다.

언급URL : https://stackoverflow.com/questions/31070671/debug-spring-boot-in-docker