将Eclipse连接到Docker容器以进行远程调试

时间:2018-04-10 15:41:53

标签: java eclipse docker port remote-debugging

我试图将eclipse连接到我运行的docker容器但是我遇到了麻烦。

我的docker run命令如下:

docker run --rm -it -p 8000:8000 -p=8668:8080 -p 8010:8009 -p 8443:8443 \
--name myContainer -h theContainer -e JVM_ROUTE=myContainer1 myContainer:qa

在eclipse中,我与localhost作为主机连接,8000作为端口。我转到Run-> Debug Configurations->远程Java应用程序,并且我已经创建了一个新的调试配置。

my project debugging

当我点击apply,然后调试时,我收到一条弹出错误消息Failed to connect to remote VM.

cant connect

我还需要做些什么才能使远程调试正常工作?

3 个答案:

答案 0 :(得分:1)

操作系统: Ubuntu 18

Java: OpenJdk 12

Docker Container: Sprint引导应用程序

要在Eclipse中连接远程调试,您可以按照以下步骤操作:

  1. 将这些行放入应用程序Dockerfile

    EXPOSE 7074
    # For Windows Machine [NOT TESTED]
    # ENV DEBUG_INFO="-Xdebug -Xrunjdwp:transport=dt_shmem,address=debug,server=y,suspend=n"
    # For Linux Machine
    ENV DEBUG_INFO="-Xdebug -Xrunjdwp:transport=dt_socket,address=0.0.0.0:7074,server=y,suspend=n"
    ENTRYPOINT [ "sh", "-c", "java ${DEBUG_INFO} -Dspring.profiles.active=docker -jar /pharmacy-service.jar" ]

  1. 启动您的docker应用程序并搜索网络,在本例中为 ecs-core_default
    $ docker network ls
    NETWORK ID          NAME                DRIVER              SCOPE
    e63bb0decc92        bridge              bridge              local
    94aefcdbb5f3        ecs-core_default    bridge              local
  1. 现在使用来为您的应用检查IP,


    $ docker network inspect ecs-core_default
    [
        {
            "Name": "ecs-core_default",
            .....
            "IPAM": {
                "Driver": "default",
                "Options": null,
                "Config": [
                    {
                        "Subnet": "172.18.0.0/16",
                        "Gateway": "172.18.0.1"
                    }
                ]
            },
            .....
            "Containers": {
                "29bebdc31d6bf2057ed31074407c780cc718396ca49f58e766e098fceaa41a41": {
                    "Name": "ecs-core_pharmacy-service_1",
                    "EndpointID": "fadc9b40bfed1d4b2104b96fb6930bda47928256092c268aa4cb67407c2c1661",
                    "MacAddress": "02:42:ac:12:00:06",
                    "IPv4Address": "172.18.0.6/16",
                    "IPv6Address": ""
                }
            }
            .....
        }
    ]


  1. 从容器“ IPv4Address”中复制IP地址:“ 172.18.0.6/16”,即 172.18.0.6
  2. 在Eclipse中,运行->调试配置,使用IP和公开的端口(即7074)。 enter image description here

享受!

答案 1 :(得分:0)

可以通过

远程调试在docker容器中运行的java应用程序
  1. 为容器中的java进程启用JDWP,例如

    java -Xdebug -Xrunjdwp:transport=dt_socket,address=8000,server=y,suspend=y [...]
    

    或使用JAVA_OPTS环境变量

    JAVA_OPTS="-Xdebug -Xrunjdwp:transport=dt_socket,address=8000,server=y,suspend=y"
    

    请注意,suspend=y将阻止应用程序启动,直到将远程调试程序连接到JVM。如果使用suspend=n,应用程序将正常启动,允许远程调试器稍后连接。

  2. 连接到流程,例如通过IDE,使用上面address=<port>设置中指定的端口,重要的是 docker host 的ip地址,除非你在linux上运行,否则可能不是{{1} }。如果您使用的是localhost,则可以使用docker-machine显示docker host ip,例如

    docker-machine ip

答案 2 :(得分:0)

通过将localhost替换为我的实际IP地址来解决这个问题。