【问题标题】:Mendix: enabling debugger in docker containerMendix:在 docker 容器中启用调试器
【发布时间】:2022-02-15 02:50:19
【问题描述】:

我们将 Mendix 用于我们的一些定制应用程序;我们正准备从 m2ee-tools 迁移到本地系统的 docker 部署。这是因为 Mendix 从 Centos/RHEL 8 开始放弃对 m2ee-tools 的支持,而最新支持的 Centos/RHEL 7 将在大约 2 年(2024 年 6 月)后终止。

我们在概念验证场景中遇到了一个关键点,需要帮助:

如何在 docker 容器中运行的 Mendix 应用中启用/禁用调试器?

我们已经找到了什么:

  1. -e DEBUGGER_PASSWORD="stringData"

我们知道在容器启动时会通过向容器提供变量 DEBUGGER_PASSWORD="stringData" 来触发调试器,但随后在此容器实例的整个生命周期中都会启用调试器,这是不希望的。

  1. 部分知识:POST 请求用于与调试器通信

从一些深入的分析中,我们还发现调试器通常通过对正在运行的应用程序的 POST 请求在正在运行的 Mendix 应用程序上启用。但是,我们目前不知道消息正文是什么。

【问题讨论】:

    标签: docker debugging mendix


    【解决方案1】:

    我们已经确定了答案。由于找到答案并非易事,原来的问题已经 3 周没有答案了,并且已经收到了赞成票,因此我会将答案添加到这个帖子中,这样在其他 Mendix 开发人员搜索“docker”+“debugger”时很有用”。

    bash 中提供的解决方案

    使用以下命令参数化并启动的容器:

    docker run -it -p 8088:8080  \
        -e ADMIN_PASSWORD='ApplicationAdminPassword1'  \
        -e DATABASE_ENDPOINT='postgres://pgPassword:pgUser@192.168.0.1:5432/pgDbName'  \
        -e M2EE_PASSWORD='PasswordForAdministrativeTasks1'  \
        mendix/mendix-buildpack:v1.2
    

    可以像这样启用调试器:

    curl -X POST -u 'MxAdmin:PasswordForAdministrativeTasks1'  \
         -H "Content-Type: application/json"  \
         -H "X-M2EE-Authentication: `echo -n 'PasswordForAdministrativeTasks1' | base64`"  \
         -H "Connection: close"  \
         -d '{"action": "enable_debugger", "params": {"password": "aRandomPassForDebugger1"}}' \
         localhost:8088/_mxadmin/; echo
    

    调试器可以正常使用,通过地址http://applicationHostIP:8088/debugger/ 使用您声明的密码“aRandomPassForDebugger1”。 M2ee-tools 似乎只使用字母数字字符(也许是为了避免在某些上下文或情况下出现特殊字符的麻烦)——在这种情况下,必须通过延长密码强度来获得密码强度。 M2ee-tools 使用超过 20 个字符。

    第二个动作实际上可以使用多种工具来执行,而不是单独使用 curl。

    对解决方案的评论

    两本手册很有帮助,但需要付出一些努力才能“接受”并转化为启用调试器的方法。可以在docs.mendix.comgithub.com/mendix 找到这些手册。

    如您所见,为了与运行时通信,您需要发送带有简单身份验证和附加标头的 POST 消息。 Mendix 团队决定从 m2ee-tools 使用的管理端口迁移到应用程序配置 Web 端的“_mxadmin”目录下的 docker 容器中可用的服务。

    注意这部分:

    -H "X-M2EE-Authentication: `echo -n 'PasswordForAdministrativeTasks1' | base64`"
    

    它是一个带有 base64 编码密码的标头(是的,在同一个 POST 消息中再次提供了相同的密码,只是以不同的形式提供)。您可以用离线制作的字符串替换内联(计算base64),在本例中为UGFzc3dvcmRGb3JBZG1pbmlzdHJhdGl2ZVRhc2tzMQ==

    注意消息的paylod是一个json数据结构。许多有效负载操作只需要“action”子句,但其他一些额外需要参数(如 enable_debugger)。

    与主题相关的操作

    • enable_debugger '{"action": "enable_debugger", "params": {"password": "aStrongPass"}}'
    • get_debugger_status '{"action": "get_debugger_status"}'
    • disable_debugger '{"action": "disable_debugger"}'
    • get_admin_action_info '{"action": "get_admin_action_info"}'

    最后列出的操作 (get_admin_action_info) 可能对找出与运行时消息通信的许多其他操作特别有用(它返回可用操作的列表),所以请自己尝试一下。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-01-04
      • 1970-01-01
      • 1970-01-01
      • 2021-11-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多