debugging - 在 Docker 中启用 Wildfly 域模式下的调试 - 端口已在使用中

标签 debugging networking docker port wildfly

我正在为一组开发人员提供完整的 docker 环境,主要包括 Wildfly、MySQL 和 Apache。
我根据生产预先配置了所有图像,并且开发人员现在要求提供更多选项:能够使用 intellij 调试正在运行的 Wildfly 从站。

设置:
当人们使用不同的操作系统时,我设置了一个虚拟机来托管 docker。
我转发必须可以从托管 VM 的本地计算机访问的端口。这行得通,他们可以访问数据库、wildfly 管理等。这里是 VM 配置和端口的屏幕​​截图:
debian machine hosting docker

带有调试功能的主机的 Dockerfile(不起作用):

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


作为容器生成的图像记录以下内容:

=========================================================================

  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
将端口从 8787 更改为其他端口。
暴露端口,不暴露端口。
服务器=y,服务器=n

我在跑:
Docker 版本 1.11.2,
野蝇 8.2
Docker 网络检查:

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": {}
    }


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

最佳答案

通过将值放入 JAVA_OPTS环境变量它将用于进程 Controller 和主机 Controller 。您看到错误是因为当进程 Controller 尝试绑定(bind)到主机 Controller 时,主机 Controller 已经有一个调试代理在监听端口 8787。

我的猜测是你想在服务器上实际调试你的应用程序。如果您的 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>

关于debugging - 在 Docker 中启用 Wildfly 域模式下的调试 - 端口已在使用中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41508313/

相关文章:

windows - 切换 JIT 调试器?

java - 更快地检测 Java/Android 中的损坏套接字

python - docker.errors.DockerException : Error while fetching server API version

docker - 如何在 docker build 中提供和使用命令行参数?

python - 列操作 R

ios - 无法在ios模拟器中调试

android - Android 模拟器上的 Instagram

c - 使用 TCP 在 C 中发送两个字节

docker - 如何使用 htdigest 创建用户而不提示输入密码

ios - Xcode 调试器是否可以捕获违反 Apple 的 “App Transport Security” 策略的陷阱