在Docker中启用Wildfly域模式的debugging – 端口已经在使用

我为一组开发人员提供了完整的docker环境,主要包括Wildfly,MySQL和Apache。 我根据生产预先configuration了所有图像,现在开发人员已经请求了另一个选项:能够使用intellij来debugging正在运行的野蛮奴隶。

设置:我设置了一个虚拟机来托pipeDocker,因为人们使用不同的操作系统。 我转发必须从承载VM的本地计算机可访问的端口。 这个工作,他们可以访问数据库,野蛮的pipe理等虚拟机configuration和端口的屏幕​​截图: debian机托pipe泊坞

Dockerfile的主机debugging(这不是工作):

FROM ourerpo/wildfly:base ARG VERSION=8.2.0 WORKDIR $JBOSS_USER_HOME ENV JAVA_OPTS='-Xms64m -Xmx512m -XX:MaxPermSize=256m -Djava.net.preferIPv4Stack=true -Djboss.modules.system.pkgs=org.jboss.byteman -Djava.awt.headless=true -agentlib:jdwp=transport=dt_socket,address=0.0.0.0:8787,server=y,suspend=n' ADD srv srv/ RUN mkdir -p $JBOSS_CONF \ && mv srv/wildfly.conf.slave $JBOSS_CONF/wildfly.conf \ && chown $JBOSS_USER:$JBOSS_USER $JBOSS_CONF \ && chmod 644 $JBOSS_CONF \ && chown $JBOSS_USER:$JBOSS_USER srv/ -R \ && chmod 744 srv/*.sh USER $JBOSS_USER # Move in template host configuration and insert slave key RUN mv srv/host-slave-${VERSION}.tmpl $JBOSS_DOMAIN/configuration/host-slave.xml \ && cat $JBOSS_DOMAIN/configuration/host-slave.xml | sed -e"s@<secret value=\".*\"/>@<secret value=\"somevalue\"/>@" >$JBOSS_DOMAIN/configuration/host-slave.xml.new \ && mv $JBOSS_DOMAIN/configuration/host-slave.xml.new $JBOSS_DOMAIN/configuration/host-slave.xml ENTRYPOINT exec /app/wildfly/bin/domain.sh --domain-config=domain.xml --host-config=host-slave.xml -Djboss.domain.master.address=stsdomain -Djboss.bind.address=0.0.0.0 

生成为容器时的图像logging以下内容:

 ========================================================================= JBoss Bootstrap Environment JBOSS_HOME: /app/wildfly JAVA: /app/java/bin/java JAVA_OPTS: -Xms64m -Xmx512m -XX:MaxPermSize=256m -Djava.net.preferIPv4Stack=true -Djboss.modules.system.pkgs=org.jboss.byteman -Djava.awt.headless=true -agentlib:jdwp=transport=dt_socket,address=0.0.0.0:8787,server=y,suspend=n ========================================================================= Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=256m; support was removed in 8.0 Listening for transport dt_socket at address: 8787 14:58:27,755 INFO [org.jboss.modules] (main) JBoss Modules version 1.3.3.Final 14:58:27,875 INFO [org.jboss.as.process.Host Controller.status] (main) JBAS012017: Starting process 'Host Controller' [Host Controller] Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=256m; support was removed in 8.0 [Host Controller] ERROR: transport error 202: bind failed: Address already in use [Host Controller] ERROR: JDWP Transport dt_socket failed to initialize, TRANSPORT_INIT(510) [Host Controller] JDWP exit error AGENT_ERROR_TRANSPORT_INIT(197): No transports initialized [debugInit.c:750] [Host Controller] FATAL ERROR in native method: JDWP No transports initialized, jvmtiError=AGENT_ERROR_TRANSPORT_INIT(197) 14:58:28,000 INFO [org.jboss.as.process.Host Controller.status] (reaper for Host Controller) JBAS012010: Process 'Host Controller' finished with an exit status of 134 

有两件事要注意:

 -agentlib:jdwp=transport=dt_socket,address=0.0.0.0:8787,server=y,suspend=n ERROR: transport error 202: bind failed: Address already in use 

所以港口应该在使用,使用netstat我不能看到它:

 me@machine:~/mapped$ netstat -tulpn (Not all processes could be identified, non-owned process info will not be shown, you would have to be root to see it all.) Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN - tcp6 0 0 :::9999 :::* LISTEN - tcp6 0 0 :::8050 :::* LISTEN - tcp6 0 0 :::22 :::* LISTEN - tcp6 0 0 :::13080 :::* LISTEN - tcp6 0 0 :::15672 :::* LISTEN - tcp6 0 0 :::9990 :::* LISTEN - tcp6 0 0 :::5671 :::* LISTEN - tcp6 0 0 :::5672 :::* LISTEN - tcp6 0 0 :::2376 :::* LISTEN - tcp6 0 0 :::3306 :::* LISTEN - udp 0 0 0.0.0.0:68 0.0.0.0:* - udp 0 0 172.17.0.1:123 0.0.0.0:* - udp 0 0 172.10.12.1:123 0.0.0.0:* - udp 0 0 10.0.2.15:123 0.0.0.0:* - udp 0 0 127.0.0.1:123 0.0.0.0:* - udp 0 0 0.0.0.0:123 0.0.0.0:* - udp6 0 0 fe80::1053:e1ff:fed:123 :::* - udp6 0 0 fe80::2c88:1cff:fe9:123 :::* - udp6 0 0 fe80::42:3dff:fe28::123 :::* - udp6 0 0 fe80::58c3:fdff:fe3:123 :::* - udp6 0 0 fe80::d435:6fff:fee:123 :::* - udp6 0 0 fe80::8091:1aff:fe7:123 :::* - udp6 0 0 fe80::2459:65ff:fe0:123 :::* - udp6 0 0 fe80::94b2:9fff:fe6:123 :::* - udp6 0 0 fe80::42:19ff:fe2f::123 :::* - udp6 0 0 fe80::a00:27ff:fef4:123 :::* - udp6 0 0 ::1:123 :::* - udp6 0 0 :::123 :::* - 

Docker检查容器:

  "NetworkSettings": { "Bridge": "", "SandboxID": "9ac8dad9fd93a0fb9bdff4c068b8e925aa9ff941df4f81033ce910a093f36a78", "HairpinMode": false, "LinkLocalIPv6Address": "", "LinkLocalIPv6PrefixLen": 0, "Ports": { "11080/tcp": null, "8787/tcp": null, "8899/tcp": null 

我已经尝试过的事情:更改-Djava.awt.headless=t rue -agentlib:jdwp=transport=dt_socket,address=0.0.0.0:8787 -Djava.awt.headless=t rue -agentlib:jdwp=transport=dt_socket,address=8787-Djava.awt.headless=t rue -agentlib:jdwp=transport=dt_socket,address=8787

将端口从8787更改为其他内容。 暴露端口,不暴露端口。 Server = y,Server = n

我正在运行:Docker版本1.11.2,Wildfly 8.2 Dockernetworking检查:

 me@machine:~/mapped$ docker network inspect compose_stsdevnet [ { "Name": "compose_thenet", "Id": "9a17953da5f9698f3f27cf18d9d41751d049774439a53629fdcd69a996e370db", "Scope": "local", "Driver": "bridge", "EnableIPv6": false, "IPAM": { "Driver": "default", "Options": null, "Config": [ { "Subnet": "172.10.12.0/24" } ] }, "Internal": false, "Containers": { <other containers here> <failing container> "9094b4136707e643df69fdff7dc04432a8d9c36275c3ae6dc6f2286393d3753a": { "Name": "stupefied_stonebraker", "EndpointID": "0c425d16334ecf3127233156d9770dc286bf72f57d778efe01fafb4696a17012", "MacAddress": "02:42:ac:0a:0c:03", "IPv4Address": "172.10.12.3/24", "IPv6Address": "" }, <the domain> "e4dd4f67f33df6643c691aa74a71dc4a8d69738004dfbe09b20c3061bd3bc614": { "Name": "stsdomain", "EndpointID": "0c89e70edbddb34f7be6b180a289480e1ac57ef482a651f0addce167eaa1110a", "MacAddress": "02:42:ac:0a:0c:18", "IPv4Address": "172.10.12.24/24", "IPv6Address": "" } }, "Options": {}, "Labels": {} } 

任何想法或build议将不胜感激。 提前致谢。

通过将值放在JAVA_OPTS环境variables中,它将用于进程控制器和主机控制器。 您看到了错误,因为当过程控制器尝试绑定到端口8787时,主机控制器已经有一个侦听代理侦听。

我的猜测是你想在服务器上实际debugging你的应用程序。 如果在你的host-slave.xml中是这种情况,你需要添加类似下面的东西到特定的服务器。

 <jvm name="default"> <jvm-options> <option value="-agentlib:jdwp=transport=dt_socket,address=8787,server=y,suspend=n"/> </jvm-options> </jvm> 

例:

 <servers> <server name="server-one" group="main-server-group"> <jvm name="default"> <jvm-options> <option value="-agentlib:jdwp=transport=dt_socket,address=8787,server=y,suspend=n"/> </jvm-options> </jvm> </server> <server name="server-two" group="other-server-group"> <!-- ~ server-two avoids port conflicts by incrementing the ports in ~ the default socket-group declared in the server-group --> <socket-bindings port-offset="150"/> </server> </servers>