在 Docker 中使用 IDEA 远程调试 Openresty LUA

我有一个运行在 Docker 容器中的 openresty 应用程序:

FROM openresty/openresty:xenial

RUN luarocks install luasocket

# 为了方便将其他二进制文件添加到 PATH 中
ENV PATH=$PATH:/usr/local/openresty/luajit/bin:/usr/local/openresty/nginx/sbin:/usr/local/openresty/bin
ENV LUA_PATH="/usr/local/openresty/site/lualib/?.ljbc;/usr/local/openresty/site/lualib/?/init.ljbc;/usr/local/openresty/lualib/?.ljbc;/usr/local/openresty/lualib/?/init.ljbc;/usr/local/openresty/site/lualib/?.lua;/usr/local/openresty/site/?.lua;/usr/local/openresty/site/lualib/?/init.lua;/usr/local/openresty/site/?/init.lua;/usr/local/openresty/lualib/?.lua;/usr/local/openresty/lualib/?/init.lua;./?.lua;/usr/local/openresty/luajit/share/luajit-2.1.0-beta3/?.lua;/usr/local/share/lua/5.1/?.lua;/usr/local/share/lua/5.1/?/init.lua;/usr/local/openresty/luajit/share/lua/5.1/?.lua;/usr/local/openresty/luajit/share/lua/5.1/?/init.lua"
ENV LUA_CPATH="/usr/local/openresty/site/lualib/?.so;/usr/local/openresty/lualib/?.so;./?.so;/usr/local/lib/lua/5.1/?.so;/usr/local/openresty/luajit/lib/lua/5.1/?.so;/usr/local/lib/lua/5.1/loadall.so;/usr/local/openresty/luajit/lib/lua/5.1/?.so"
CMD ["/usr/local/openresty/bin/openresty", "-g", "daemon off;"]

这是 nginx.conf 的示例:

server {
    listen       80;
    server_name  localhost;

    # 禁用代码缓存,不需要重新加载包含所有更改的 nginx
    lua_code_cache off;

    location / {
        rewrite_by_lua_block {
            local Core = require "core"
            Core.rewrite()
        }
    }
}

核心lua文件源代码(每一行都有断点):

_G.debug = require("debug")

local Core = {}

function Core:rewrite()
    require("mobdebug").start("host.docker.internal")
    local a = 2
    ngx.say(a)
end

return Core

因此,我尝试使用 EmmyLua(IDEA)+ mobdebug 远程调试 openresty 应用程序。

IDEA 目录配置

调试开始后+进行 http 调用:

Start mobdebug server at port:8172
Waiting for process connection...
Connected.

之后就没有任何事情发生了。 我可以看到 openresty 的响应,但调试仍然处于活动状态,消息为 “Connected。”。

我做错了什么?

点赞
用户1442917
用户1442917

我没有看到你设置有任何问题。只要执行经过特定的行并且调试钩子被触发,你就应该看到对has_breakpoint的调用(除非你手动"调试"代码)。

如果这没有发生,那么你可能需要检查设置断点的代码是否在协程中执行,因为协程调试应该明确启用。有关详细信息,请参见此文档部分

如果这仍然无法帮助,您可能需要在mobdebug的debug_hook函数中添加一些print命令,以查看它是否在有断点的那些行上被触发,并且在此之后会发生什么事。

2019-07-11 18:48:11
用户5118421
用户5118421

如何在暴露端口的情况下运行 Docker 镜像?您是否收到了“绑定到 0.0.0.0:8172 失败:端口已分配”的消息?

谢谢, Irina

2019-08-21 14:03:13