一般情况下,授权应用是通过统一的服务端进行管理授权的。但是由于我司是争对网络服务商提供应用技术支持的,服务器并不能连接到外网上,所以不能进行网络授权。所以需要根据服务器的唯一标识(如CPUID)进行注册码生成,但是如果把应用发布到Docker时,便获取不到宿主机的CPUID,这时我举例如下:
- 在非Docker环境下获取注册码ID
/**
- 获取linux/unix系统设备的CPUID
- @return
*/
public static String getLinuxCpuId(boolean isReturnPrefix) {
String result = "";
Runtime rt = Runtime.getRuntime();
try {
Process proc = rt.exec("dmidecode");
InputStreamReader isr = new InputStreamReader(proc.getInputStream());
BufferedReader br = new BufferedReader(isr);
String line = null;
boolean istest = false;
while ((line = br.readLine()) != null) {
if (line.toUpperCase().contains("Processor Information".toUpperCase())) {
istest = true;
}
if (istest && line.trim().toUpperCase().startsWith("ID:")) {
result = line.toUpperCase().trim().substring(3);
break;
}
}
isr.close();
result=result.trim();
if(!"".equals(result)){
if(isReturnPrefix)
result="CPUID:"+result;
}
result = result.replace(" ", "");
return result;
} catch (IOException e) {
logger.error("获取linux/unix系統cpuId发生异常。原因:",e);
return null;
}
}
如果要在Docker容器中调用dmidecode命令,则需要将宿主机上的dmidecode程序映射到Docker容器中才可使用。我以创建nginx容器为例:
docker run -id \
--privileged=true \
--name test_nginx \
-p 8888:80 \
-v /sbin/dmidecode:/sbin/dmidecode \
-v /dev/mem:/dev/mem \
nginx