java在docker容器内执行linux的dmidecode命令

最近在项目开发过程中,需要用java去调用windows操作系统和linux操作系统的命令来获取一些计算机信息,执行命令的代码没什么好说的,如下所示:

        //windows环境下使用WMIC获取CPU序列号
        //使用WMIC获取CPU序列号
        Process process = Runtime.getRuntime().exec("wmic cpu get processorid");
        process.getOutputStream().close();
        //如果需要获得执行命令后的返回值,从这个流中获得process.getInputStream()

		//linux下获取cpu序列号
		//使用dmidecode命令获取CPU序列号
        String[] shell = {"/bin/bash", "-c", "dmidecode -t processor | grep 'ID' | awk -F ':' '{print $2}' | head -n 1"};
        Process process = Runtime.getRuntime().exec(shell);
        process.getOutputStream().close();

        BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
        //TO DO 之后是一些读取操作

OK,这些代码看起来非常好,没什么问题,还根据windwos和linux的情况作了处理。
BUT!你要是把服务直接部署到linux上,用docker启动,那恭喜你就掉进了一个大坑。

通过上面的代码我们不难看懂,JAVA通过

Runtime.getRuntime().exec(“xxxxxx”)

这段代码去运行了dos命令。
正常运行吧倒也没什么问题,重点是docker是个什么东西,它是个容器化技术啊,它只为服务运行提供最低标准的运行环境以降低内存消耗。这里划个重点,最低标准。相当于容器内只有残缺的linux系统和你的服务代码,只要服务的代码能跑起来,我这个系统内其他的东西都是多余的,容器内都不需要,比如说接下来要讲到的dmidecode

dmidecode是centOS7操作系统内置的工具(对于其他的linux操作系统笔者不了解),用户可用dmidecode命令来查看一些计算机信息。

我们刚才的代码中就用到了dmidecode命令。由于容器内没有dmidecode工具,那么一执行,就嗝屁了。

如果要在docker容器中运行dmidecode命令,那么要将宿主机的如下两个目录挂载到容器中
1:/sbin/dmidecode --这个目录是dmidecode程序的目录,如果不挂载那么容器中识别不了dmidecode命令
2:/dev/mem --dmidecode调用时会使用到mem这个文件,如果不挂载会找不到文件
并且还需要在启动时增加 --privileged 这个参数,让容器获得近似于宿主机root的权限
完整的运行命令如下:
docker run -d --privileged -v /sbin/dmidecode:/sbin/dmidecode -v /dev/mem:/dev/mem --name my-tomcat -p 9090:8080 tomcat
(以近似于root的权限用后台模式启动tomcat这个镜像,取别名为my-tomcat,并挂载两个宿主机目录到容器中,将容器的8080端口映射到宿主机9090端口)

总结一下,其实容器中想要用的任何东西,无论是文件还是程序还是什么别的,都可以通过挂载的形式从宿主机中挂载到容器中,让容器中可以访问到。

  • 6
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 11
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值