debug spring-boot in docker

时间:2015-06-26 10:18:05

标签: java spring docker spring-boot

For some reason I have issues connecting remote debug to a spring-boot app running inside docker. I start the java app with:

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

For docker I expose these ports on docker-compose:

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

However, the debugger is not able to connect on port 8000. It works when I run the server locally but not inside docker. Any idea why?

Docker ps output:

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

4 个答案:

答案 0 :(得分:8)

我必须意识到在dockerFile中,Expose命令只执行一半的工作,这意味着只显示docker内部的端口,但不在外部,在您的示例中,结果将如下所示:

enter image description here

Debug与JAVA_OPTS和远程调试一起使用,dockerFile如下所示:

function createFilter()
{

    d3.select(".filterContainer").selectAll("div")
        .data(myData)
        .enter()
        .append("div")
        .attr("class", "select-wrapper")
        .append("select")
        .each(function(d) {
            // create select option for each data
            d3.select(this)
                .append("option")
                .attr("id", function(d) {return "chk_" + d;})
                .text(function(d){return d;});
        });

}

并执行此命令:

<Text class="customStyleClass_1" text="Hellow World!" visible="{= ${somevalue} > '0' ? false : true }"/>

<Text class="customStyleClass_2" text="Hellow World!" visible="{= ${somevalue} > '0' ? true : false }"/>

正如您所看到的,您应该在运行期间公开调试端口,在我的情况下(eclipse)8000

enter image description here

enter image description here

答案 1 :(得分:7)

嗨,我遇到了同样的问题。

我将以下内容添加到Dockerfile中的入口点:

  

“ - agentlib:JDWP =运输= dt_socket,地址= 8000,服务器= Y,暂停= 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。

希望这有帮助。

答案 2 :(得分:0)

我认为原因可能是,您的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中

答案 3 :(得分:0)

对我来说,仅在address命令行参数中指定调试端口是不够的。我还需要通过在端口前面加上*:来通配所有IP地址:

java -agentlib:jdwp=transport=dt_socket,address=*:8000,server=y,suspend=n -jar spring-app.jar