今天主要来实现一下 go-docker ps 的功能,也就是查看当前有哪些容器,简单说下思路,当我们启动一个容器时就为该容器创建一个文件夹用来保存该容器的一些信息,如果我们给容器指定了名字,那么该文件夹名字就是我们指定的名字,如果未指定,就用我们自动生成的容器 ID 作为文件夹名,同时在该文件夹中创建config.json用来保存容器信息

文件夹结构

go-docker└── 容器名/容器ID    ├── config.json    └── container.log

  • config.json 记录容器基础信息
  • container.log 记录容器内容日志

记录容器信息

创建容器时,同时给该容器创建一个文件夹,文件夹内并创建 config.json 来保存容器信息,这里先看下我们要保存容器哪些信息

type ContainerInfo struct { Pid         string   `json:"pid"`     // 容器的init进程再宿主机上的PID Id          string   `json:"id"`      // 容器ID Command     string   `json:"command"` // 容器内init进程的运行命令 Name        string   `json:"name"` CreateTime  string   `json:"createTime"` Status      string   `json:"status"` Volume      string   `json:"volume"`      //容器的数据卷 PortMapping []string `json:"portmapping"` //端口映射}

看下代码实现,比较简单,一共就 3 步

  1. 创建以容器名或 ID 命名的文件夹
  2. 在该文件下创建 config.json
  3. 将容器信息保存到 config.json 中
// 记录容器信息func RecordContainerInfo(containerPID int, cmdArray []string, containerName, containerID string) error { info := &ContainerInfo{  Pid:        strconv.Itoa(containerPID),  Id:         containerID,  Command:    strings.Join(cmdArray, ""),  Name:       containerName,  CreateTime: time.Now().Format("2006-01-02 15:04:05"),  Status:     common.Running, }

 dir := path.Join(common.DefaultContainerInfoPath, containerName) _, err := os.Stat(dir) if err != nil && os.IsNotExist(err) {  err := os.MkdirAll(dir, os.ModePerm)  if err != nil {   logrus.Errorf("mkdir container dir: %s, err: %v", dir, err)   return err  } }

 fileName := fmt.Sprintf("%s/%s", dir, common.ContainerInfoFileName) file, err := os.Create(fileName) if err != nil {  logrus.Errorf("create config.json, fileName: %s, err: %v", fileName, err)  return err }

 bs, _ := json.Marshal(info) _, err = file.WriteString(string(bs)) if err != nil {  logrus.Errorf("write config.json, fileName: %s, err: %v", fileName, err)  return err }

 return nil}

遍历容器

简单说下实现逻辑

  1. 遍历 go-docker文件夹
  2. 读取每个容器内的 config.json 文件
  3. 格式化打印
func ListContainerInfo() { files, err := ioutil.ReadDir(common.DefaultContainerInfoPath) if err != nil {  logrus.Errorf("read info dir, err: %v", err) }

 var infos []*ContainerInfo for _, file := range files {  info, err := getContainerInfo(file.Name())  if err != nil {   logrus.Errorf("get container info, name: %s, err: %v", file.Name(), err)   continue  }  infos = append(infos, info) }

 // 打印 w := tabwriter.NewWriter(os.Stdout, 12, 1, 2, ' ', 0) _, _ = fmt.Fprint(w, "ID\tNAME\tPID\tSTATUS\tCOMMAND\tCREATED\n") for _, info := range infos {  _, _ = fmt.Fprintf(w, "%s\t%s\t%s\t%s\t%s\t%s\t\n", info.Id, info.Name, info.Pid, info.Status, info.Command, info.CreateTime) }

 // 刷新标准输出流缓存区,将容器列表打印出来 if err := w.Flush(); err != nil {  logrus.Errorf("flush info, err: %v", err) }}

// 获取容器内基本信息func getContainerInfo(containerName string) (*ContainerInfo, error) { filePath := path.Join(common.DefaultContainerInfoPath, containerName, common.ContainerInfoFileName) bs, err := ioutil.ReadFile(filePath) if err != nil {  logrus.Errorf("read file, path: %s, err: %v", filePath, err)  return nil, err } info := &ContainerInfo{} err = json.Unmarshal(bs, info) return info, err}

扫码关注更多精彩

go 设置进程名_七天用Go写个docker(第六天)相关推荐

  1. easyexcel 在 设置标题_七. EasyExcel标题加批注和标题字体填充红色

    一, 概述 在日常开发中, 经常会碰到导入导出的场景, 有导入就肯定有导入模板, 本文将介绍利用EasyExcel给标题添加批注和挑剔字体填充颜色 二. 代码 2.1 编写样式处理类: TitleHa ...

  2. goland go test_七天用Go写个docker(第一天)

    1. docker详解 很多人刚接触docker的时候就会感觉非常神奇,感觉这个技术非常新颖,其实并不然,docker使用到的技术都是之前已经存在过的,只不过旧酒换了新瓶罢了.简单来说docker本质 ...

  3. C/C++学习之路_七: 内存管理

    C/C++学习之路_七: 内存管理 目录 作用域 内存布局 内存分区代码分析 1. 作用域 C语言变量的作用域分为: 代码块作用域(代码块是{}之间的一段代码) 函数作用域 文件作用域 1. 局部变量 ...

  4. shell for循环命令行_七年老运维实战中的 Shell 开发经验总结

    来源:良许Linux ID:liangxuxiansheng 无论是系统运维,还是应用运维,均可分为"纯手工"-> "脚本化"-> "自动 ...

  5. 帝国cms linux伪静态规则,置帝国cms如何设置tag标签伪静态化 linux伪静态设置方法_博客...

    <置帝国cms如何设置tag标签伪静态化 linux伪静态设置方法_博客>由会员分享,可在线阅读,更多相关<置帝国cms如何设置tag标签伪静态化 linux伪静态设置方法_博客(6 ...

  6. 创维E900V22C、E900V22D_S905L3A_开启adb root_原生设置无密码_通刷卡刷固件

    创维E900V22C.E900V22D_AmlogicS905L3A_安卓9_默认开启adb root_原生设置无密码_通刷卡刷固件_基于广东原版制作. 固件特点: 创维E900V22C.E900V2 ...

  7. 孤荷凌寒自学python第七十九天开始写Python的第一个爬虫9并使用pydocx模块将结果写入word文档...

    孤荷凌寒自学python第七十九天开始写Python的第一个爬虫9 (完整学习过程屏幕记录视频地址在文末) 今天在上一天的基础上继续完成对我的第一个代码程序的书写. 到今天终于完成了对docx模块针对 ...

  8. 8家大厂SSP offer的清华学长谈算法岗是否人间地狱(送七本学长手写iPad笔记)...

    点击上方,选择星标或置顶,每天给你送上干货 作者 | 对白 出品 | 对白的算法屋 编者寄语: 本文看完,相信对你求职算法岗会有一番新的认识. 大家好,我是对白. 之前一直在坚持输出着原创技术文章,同 ...

  9. 8家大厂SSP offer的清华学长谈算法岗是否人间地狱(送七本学长手写iPad笔记)

    作者 | 对白 出品 | 对白的算法屋 编者寄语: 本文看完,相信对你求职算法岗会有一番新的认识. 大家好,我是对白. 之前一直在坚持输出着原创技术文章,同时也在忙于校招内推**(已内推2000+人) ...

最新文章

  1. 业界 | 每天1.4亿小时观看时长,Netflix怎样存储这些时间序列数据?
  2. unity之定制脚本模板
  3. [BZOJ3874/AHOI2014]宅男计划
  4. Visual Studio Code连接SQL SERVER 2019
  5. linux内核对伙伴系统的改进--migrate_type
  6. 设计模式(5)--工厂模式
  7. cf1523A. Game of Life
  8. c# 后台 添加datable 数据
  9. error C2065: “cout”: 未声明的标识符
  10. 95-30-025-java.util-AbstractMap
  11. 林毅夫1.7万字长文:我的13个经济学新见解
  12. 计算机一定要学五笔打字吗,学习五笔打字大概要多长时间
  13. 如何设置微信群名称?
  14. 接口测试需要怎么做?
  15. oracle12c安装过程
  16. maven设置阿里仓库
  17. spark数据挖掘 - 基于 Audioscrobbler 数据集音乐推荐实战
  18. 数字图像处理之灰度化
  19. GBase 8s 因更换网络导致的908错误
  20. 数据结构课设之校园导航系统(迪杰斯特拉算法)

热门文章

  1. windows开启ping功能
  2. 关于设计秒杀系统的几个问题
  3. 网络IO演变发展过程和模型介绍
  4. Dynamics CRM2011 通过DeveloperToolkit在VS中部署遇到的问题
  5. Java类加载器( 死磕9)
  6. cmake编译安装MySQL5.5.32
  7. uva live 2326 - Moving Tables
  8. php中的CURL库
  9. 【平面设计】扁平化设计(Ⅲ)——原则
  10. Copy Constructor与赋值运算符