如何在Docker容器中安装Lapis?安装报错原因咨询
这个问题我之前在部署OpenResty+Lapis的时候也碰到过,核心原因是lua-cjson 2.1.0-1版本和OpenResty内置的LuaJIT存在兼容性冲突,具体是函数声明冲突导致编译失败:
错误细节拆解
当你执行luarocks install lapis时,Lapis 1.6.0-1依赖lua-cjson,luarocks会自动拉取lua-cjson 2.1.0-1源码编译,但这个版本的lua-cjson是为标准Lua或旧版LuaJIT编写的:
lua_cjson.c:1298:13: error: static declaration of 'luaL_setfuncs' follows non-static declaration
static void luaL_setfuncs (lua_State *l, const luaL_Reg *reg, int nup)/usr/local/openresty/luajit/include/luajit-2.1/lauxlib.h:88:18: note: previous declaration of 'luaL_setfuncs' was here
LUALIB_API void (luaL_setfuncs) (lua_State *L, const luaL_Reg *l, int nup);
简单说就是:lua-cjson源码里把luaL_setfuncs声明成了静态函数,但OpenResty的LuaJIT头文件已经把这个函数声明为全局的非静态API,编译时编译器就会抛出冲突错误。
三种可行的解决办法
1. 安装适配OpenResty的lua-cjson分支
OpenResty生态有专门适配的lua-cjson版本lua-cjson-nginx,先装这个再安装Lapis:
RUN luarocks install lua-cjson-nginx && luarocks install lapis
2. 升级Lapis到兼容新版lua-cjson的版本
Lapis 1.6.0是比较旧的版本了,新版本(比如2.x系列)已经更新了依赖,适配了LuaJIT环境,直接指定版本安装即可:
RUN luarocks install lapis 2.0.2
(可以根据需要替换为最新的稳定版本)
3. 手动添加编译参数兼容旧版lua-cjson
如果一定要用Lapis 1.6.0+旧版lua-cjson,可以在安装lua-cjson时添加编译宏,让它复用LuaJIT提供的luaL_setfuncs:
RUN luarocks install lua-cjson CFLAGS="-DLUA_COMPAT_MODULE" && luarocks install lapis
额外提示
OpenResty的LuaJIT环境和标准Lua有不少差异,部署时尽量优先选择OpenResty生态维护的Lua库,或者查看库的官方文档是否有针对OpenResty的安装说明,能避免很多类似的编译冲突问题。
内容的提问来源于stack exchange,提问作者Gabor

