使用docker编译不同平台上的node native module

最近在忙于搭建公司内部的应用日志分析系统,鉴于公司架构的要求,所有的服务都必须双活。对于应用日志分析系统,现在普遍采用的都是ELK stack的框架,前端部分的kibana是必选项。而如果需要将kibana做成双活,则两个kibana之间需要做一定的同步(因为共享一个elasticsearch集群作为数据存储,则两个kibana之间在执行alarm,report等动作时,需要一定的同步机制,避免同一个alarm或者report在两台服务器上发两遍)。当然,同步的方法有很多,你可以选择直接使用elasticsearch作为同步的服务器,不过这会涉及到更多的开发工作和数据的设计工作。我是一个懒人,毕竟日志分析系统上使用到了kafka和zookeeper,那还是用zookeeper来做分布式同步吧,毕竟这货就是拿来干这个的。
但kibana是一个nodejs开发的应用,弄起来还是不如java顺手,这里分享一下,其中踩过的一些坑。

我在上一篇博文里面分享过用native C++模块扩展Node.js。但毕竟是native module,代码的内容会因为平台的不同而有差异。比如,如果你的电脑是mac或者windows,那么你编译出来的native module是无法在linux系统上使用的。在node是最流行的zookeeper client,刚好是使用原生的c代码生产的。要使用这货,你就必须在对应的操作系统上使用node-gyp编译之后才能使用。
很不幸的是,大多数人的开发电脑不是windows就是macOS,而生产服务器大多是ubuntu或REHL linux,并且无法直接连接外网。在你开发电脑上制作的kibana插件如果包含了native module,则部署到生产服务器上都无法工作。那么该如何解决这个问题呢?答案有很多,我这里推荐的是使用docker。关于docker的好处我就不再累述。一下直接分享步骤

从docker hub上拖下你生产服务器对应的操作系统版本

docker pull centos:7.2.1511

运行docker,并安装必须的工具

docker run -it --mount type=bind,source=/Users/lex/Code/bi-lass/zookeeper-plugin,target=/opt/kibana centos:7.2.1511 /bin/bash

注意,这里把你的项目工程mount到docker下

安装node-gyp

npm install node-gyp --g

安装make, g++, python

注意,这三个是必须安装的,因为docker的镜像默认是不带以下组件的,特别是make和g++,但他们都是node-gyp编译native module必须的组件。

yum install make -y
yum install gcc-c++ -y
yum install python

如果没有安装,你会在下一步的npm update的时候,发现你的native module,比如zookeeper这个模块无法编译生产。

在docker上 编译你的native module

进入你的项目工程,重新update一下你的node module。

npm update 

如果一切顺利,之前提到的zookeeper模块,会在centOS的环境下重新编译。

重新打包你的kibana plugin,发布到生产环境

猜你喜欢

转载自blog.csdn.net/u013613428/article/details/79311460