• Docker部署的时候从容器获取宿主机的CPU等信息


            最近在使用go开发后台的时候,有这么一个需求,开发的服务需要做一个license,用户需要license和服务同时在且有效的情况下才能运行服务,其实在正常情况下,也没什么,但是就是因为部署的时候客户那边可能用的是docker部署,那么如何在docker里面获取到宿主机的CPU信息就成了必须,因为license需要用到宿主机的CPU信息,也可以使用主板信息或者MAC信息等,我们这次用的是CPU序列号信息,用来做license的绑定。

            我先说下我的整个流程,代码里面我先是用go语言实现了获取CPU序列号信息,使用的是linux的dmidecode命令进行的获取,命令如下

    1. [root@dmt ~]# dmidecode -t processor | grep ID | head -1
    2. ID: 57 06 05 00 FF FB 8B 0F
    3. [root@dmt ~]#

    下面附上我使用go来获取CPU序列号的代码,返回两个参数,第一个是CPU序列号的字符串类型数据,第二个参数是错误码数据

    1. //获取CPUID函数
    2. func GET_CPUID() (string, error) {
    3. cmd := exec.Command("/bin/sh", "-c", `dmidecode -t processor | grep ID | head -1`)
    4. stdout, err := cmd.StdoutPipe()
    5. if err != nil {
    6. fmt.Println("cmd.StdoutPipe: " + err.Error())
    7. return "", err
    8. }
    9. stderr, err := cmd.StderrPipe()
    10. if err != nil {
    11. fmt.Println("cmd.StderrPipe: ", err.Error())
    12. return "", err
    13. }
    14. if err := cmd.Start(); err != nil {
    15. fmt.Println("cmd.Start: ", err.Error())
    16. return "", err
    17. }
    18. bytesErr, err := ioutil.ReadAll(stderr)
    19. if err != nil {
    20. fmt.Println("ioutil.ReadAll stderr: ", err.Error())
    21. return "", err
    22. }
    23. if len(bytesErr) != 0 {
    24. fmt.Printf("stderr is not nil: %s", bytesErr)
    25. return "", errors.New(string(bytesErr))
    26. }
    27. bytes, err := ioutil.ReadAll(stdout)
    28. if err != nil {
    29. fmt.Println("ioutil.ReadAll stdout: ", err.Error())
    30. return "", err
    31. }
    32. if err := cmd.Wait(); err != nil {
    33. fmt.Println("cmd.Wait: ", err.Error())
    34. return "", err
    35. }
    36. cpuId := string(bytes)
    37. cpuId = strings.Replace(cpuId, "ID: ", "", -1)
    38. cpuId = strings.Replace(cpuId, "\t", "", -1)
    39. cpuId = strings.Replace(cpuId, "\n", "", -1)
    40. cpuId = strings.Replace(cpuId, " ", "-", -1)
    41. return cpuId, err
    42. }

    license的计算逻辑此处不方便公开,差不多

    然后我的整个后台服务开发完成后,如果是直接在linux主机上部署,是没有任何问题的,因为直接就可以通过dmidecode命令获取到CPU的相关信息,如果是docker部署的话,需要在docker部署的yml文件里面添加如下内容。

    1. version: '3.4'
    2. services:
    3. pap:
    4. image: DOCKER_IMAGE
    5. volumes:
    6. - /etc/localtime:/etc/localtime:ro
    7. - type: bind
    8. source: /usr/sbin/dmidecode
    9. target: /usr/sbin/dmidecode
    10. - type: bind
    11. source: /dev/mem
    12. target: /dev/mem
    13. privileged: true
    14. ports:
    15. - "8000:8000"
    16. restart:
    17. always

    其中我把自己项目相关的代码都去掉了,其实最重要的就是下面这几行,每一行的作用我在后面做了备注

    • 绑定dmidecode,绑定后在docker里面也能访问dmidecode命令了
    1. - type: bind
    2. source: /usr/sbin/dmidecode
    3. target: /usr/sbin/dmidecode
    • 绑定/dev/mem,绑定这个是因为dmidecode命令要去访问/dev/mem,不然调用dmidecode的时候会报错
    1. - type: bind
    2. source: /dev/mem
    3. target: /dev/mem
    • 设置权限,不然到时候docker里面访问/dev/mem的时候会报权限不足,permission deny
     privileged: true

    然后使用添加了这些信息的yml文件部署docker的话,程序在docker里面访问CPU信息的时候就可以正常访问了。

  • 相关阅读:
    springboot基于Guava 的 RateLimiter实现限流
    Java项目:ssm赛事打分系统
    Vue全家桶 Vuex的详细介绍
    【余贞侠】- c语言程序设计第七章课后习题答案
    PMP每日一练 | 考试不迷路-8.17(包含敏捷+多选)
    将本地前端工程中的npm依赖上传到Nexus
    微信小程序通过createSelectorQuery获取元素 高度,宽度与界面距离
    W5300-TOE Arduino 网络服务器
    思维导图在初中化学“物质构成的奥秘”教学中的应用
    计算机网络的OSI七层模型
  • 原文地址:https://blog.csdn.net/u013896064/article/details/133174937