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
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 11
    评论
要在已经在运行的Docker容器Linux命令行中执行命令,可以使用以下命令进入容器的交互命令行: docker exec -it <容器名称或容器ID> bash 这将进入容器的bash shell,允许您在容器执行任何Linux命令。 如果您想以root用户身份进入容器的交互命令行,可以使用以下命令docker exec -u 0 -it <容器名称或容器ID> bash 这将以root用户身份进入容器的bash shell。请注意,您需要具有足够的权限才能以root用户身份进入容器。 引用\[1\]中提到了如何进入已经在运行的Docker容器Linux命令行,而引用\[2\]和\[3\]则提供了在容器内运行Docker的方法。 #### 引用[.reference_title] - *1* [【原创】Docker 进入容器内的 Linux 的交互命令行](https://blog.csdn.net/u011700186/article/details/109452670)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [如何在 docker 容器内部运行 docker命令](https://blog.csdn.net/ljp1919/article/details/123515090)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值