1

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

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

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

我们已经发现:

  1. -e DEBUGGER_PASSWORD="stringData"</li>

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

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

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

4

1 回答 1

0

我们已经确定了答案。由于找到答案并非易事,原来的问题已经 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"}}'
  • 获取调试器状态'{"action": "get_debugger_status"}'
  • disable_debugger'{"action": "disable_debugger"}'
  • get_admin_action_info'{"action": "get_admin_action_info"}'

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

于 2022-02-14T18:50:19.307 回答