Mendix:在 docker 容器中启用调试器

Mendix: enabling debugger in docker container

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

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

如何在 运行 容器中 运行 的 Mendix 应用程序中 enable/disable 调试器?

我们已经发现:

  1. -e DEBUGGER_PASSWORD=”stringData”

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

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

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

我们已经确定了答案。由于找到答案并非易事,原来的问题已经有 3 周没有得到解答,并且收到了赞成票,因此我将把答案添加到这个主题中,以便其他 Mendix 开发人员搜索“docker " + "调试器"。

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.com and at github.com/mendix.

找到这些手册

如您所见,为了与运行时进行通信,您需要发送带有简单身份验证和附加 header 的 POST 消息。 Mendix 团队已决定从 m2ee-tools 使用的 admin-port 迁移到 docker 容器中可用的服务,该容器位于 application-provisioning web-end 的“_mxadmin”目录中。

注意这部分:

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

这是一个带有 base64 编码密码的 header(是的,在同一 POST 消息中再次提供了相同的密码,只是以不同的形式提供)。您可以将内联(计算 base64)替换为 off-line-made 字符串,在本例中为 UGFzc3dvcmRGb3JBZG1pbmlzdHJhdGl2ZVRhc2tzMQ== .

请注意,消息的有效负载是一个 json 数据结构。许多 payload-actions 只需要“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) 有可能特别有助于找出许多其他与 runtime-messaging 通信的操作(它 returns 可用操作列表), 所以你自己试试吧。