从零自制docker-14-【实现 mydocker commit 打包容器成镜像】

文章目录

  • 目标
  • 注意
  • exec.Command
  • tar
  • 代码
  • 结果

目标

piveroot切换工作目录到/merged后,通过docker commit将此时工作目录的文件系统保存下来,使用tar包将该文件系统打包为tar文件
命令类似 ./mydocker commit myimage然后当前目录下会得到myimage.tar

注意

  • 执行commit操作是在另一个终端执行的,也就是说容器已启动并运行,此时在另一个终端执行commit操作的时候不需要在挂载或启动子进程等操作,直接是设置一个位置来存,而不是像之前一样联合挂载后再得到具体的工作目录地址了

exec.Command

exec.Command("tar", "-czf", imageTar, "-C", mntPath, ".").CombinedOutput()

这段代码是使用Go语言的标准库os/exec来执行一个外部命令,具体是调用tar命令来创建一个压缩的归档文件。这里是逐部分解释:

  • exec.Command: 这是Go语言中用于创建并运行外部命令的对象。它接受一个可变数量的字符串参数,第一个参数是命令名,后面的参数是传递给该命令的各个选项和参数。

  • "tar": 这是命令本身,tar是一个用于创建、读取、更新和管理归档文件的工具。

  • "-czf": 这些是传递给tar命令的选项。

    • -c 表示创建一个新的归档文件。这意味着你要使用 tar 命令来打包当前目录下一系列文件和目录成为一个单一的归档文件(通常是以 .tar 结尾)。这个过程不会对文件进行压缩,只是简单地将它们收集在一起形成一个归档文件,便于管理和传输。
    • -z 表示在创建归档文件时进行gzip压缩。结合 -c,这会创建一个.tar.gz格式的压缩归档文件。
    • -f 后面跟归档文件的名称。注意,由于-f需要直接跟着文件名,所以在参数列表中,imageTar变量将会作为此选项的值。
  • imageTar: 这是一个变量,代表要创建的归档文件的名称(包括路径)。例如,如果imageTar的值为/path/to/image.tar.gz,那么这个归档文件就会被创建在指定路径,并命名为image.tar.gz

  • "-C": 这个选项告诉tar在执行操作前先切换到指定的目录。这里的指定目录由接下来的参数决定。

  • mntPath: 这也是一个变量,代表一个目录路径。结合-C选项,它指定了tar执行操作前应先切换到的目录。例如,如果mntPath的值为/mnt/mydir,则会在执行打包操作前进入该目录。

  • ".": 这是一个点字符,代表当前目录。在tar命令的上下文中,它意味着打包当前目录下的所有内容。由于之前使用了-C指定了目录,这里的“当前目录”就是mntPath所指的目录。

  • .CombinedOutput(): 这个方法用来执行上述构造的命令,并捕获其标准输出和标准错误的组合输出。返回的是一个字节切片,包含命令执行后的输出文本。这在调试或需要处理命令输出的场景中非常有用。

综上所述,这段代码的功能是:在Go程序中执行一个命令,使用tar工具将mntPath目录下的所有内容打包成一个gzip压缩的归档文件,并保存为imageTar变量指定的路径和文件名。

tar

  • tar: 是 tape archive 的缩写,是一个用于创建、提取和查看 tarball(.tar 文件)的工具。
  • -t 选项:表示列出(list)tar 文件内的内容。当你对一个 .tar 文件使用 -t 选项时,tar 命令将会输出该归档文件中所有文件和目录的列表,但并不解压或提取它们。
  • -f 选项:后面跟需要操作的 tar 文件名。-f 是 file 的缩写,用来指定要处理的归档文件。

所以,当你运行 tar -tf somefile.tar 命令时,它会列出 somefile.tar 这个归档文件内部的所有文件和目录结构,每一项占一行,但并不会展开或提取这个归档文件的实际内容。这对于快速检查一个 tar 文件包含哪些内容而不需要真正提取它非常有用。

代码

https://github.com/FULLK/llkdocker/tree/main/commit_docker
增加一个command

func main(){//定义相关命令app:=cli.NewApp()app.Name="llkdocker"app.Usage="my simple docker -llkdocker "app.Commands=[]cli.Command{runcommand,initcommand,commitcommand,}//Commands 属性是一个 []cli.Command 类型的切片app.Before=func(context *cli.Context)error{log.SetFormatter(&log.JSONFormatter{})log.SetOutput(os.Stdout)return nil} //在处理命令参数之前先进行的函数if err:=app.Run(os.Args);err!=nil{log.Fatal(err)}
}

判断参数个数,并最后做出相应执行

var commitcommand = cli.Command{Name:  "commit",Usage: "commit  image",Action: func(context *cli.Context)error {args := context.Args()//commit后参数的作为这里if len(args)<1 {log.Fatal("missing the image name you want to save ")}log.Info(args)contain.Contain_commit(args)return nil},
}

这里注意tar打包好像最后只能生成一个tar文件

func Contain_commit(imagename []string){mnturl:="/home/llk/Desktop/llkdocker/commit_docker/merged"rooturl:="/home/llk/Desktop/llkdocker/commit_docker"/*var params stringfor i := 0; i < len(imagename); i++ {param := rooturl+"/"+imagename[i]+".tar "params =params+param   }	 //得到参数log.Info(params) //类似 路径/1.tar 路径/2.tar 但一次只能生成一个镜像*/imagetar:=rooturl+"/"+imagename[0]+".tar"log.Info(imagetar)if len(imagename)>1{log.Infof("too many image name ,we only can tar the first")}if _,err:=exec.Command("tar","-czf",imagetar,"-C",mnturl,".").CombinedOutput();err!=nil{log.Info(err)log.Fatal("tar error !!!")  //好像一次只能生成一个tar包 }log.Info("commit finish") //tar需要一定时间,这里做最后结束的回现}

结果

先在一个终端启动
在这里插入图片描述
然后再启动另一个终端commit
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/15111.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

「实用推荐」如何为桌面 移动跨平台应用选择UI框架/APP架构?

DevExpress .NET MAUI UI组件库提供了用于Android和iOS移动开发的高性能UI组件&#xff0c;该库包括数据网格、图表、日程、数据编辑器、CollectionView和选项卡组件。 获取DevExpress .NET MAUI最新正式版下载(Q技术交流&#xff1a;532598169&#xff09; “一次编写&#…

ABB机器人---基础编程

目录 第一章 代码解释 1.1 基础代码 1.1.2 关于 VAR robtarget pos 1.1.3 关于四元数 1.2 机器人初始化程序 1.3 配置通信 (ProfiNet 示例&#xff0c;ABB RAPID) 1.4 设置干涉区 (ABB RAPID) 1.5 示教轨迹和自动过程 (ABB RAPID) 1.6 配置抓手并进行抓取操作 (ABB RA…

springboot错误

错误总结 1、使用IDEA 的 initialalzer显示2、IDEA 新建文件 没有 java class3、java: 错误: 不支持发行版本 22解决方法4、IDEA-SpringBoot项目yml配置文件不自动提示解决办法 1、使用IDEA 的 initialalzer显示 IDEA创建SpringBoot项目时出现&#xff1a;Initialization fail…

公认最好用的随身wifi品牌推荐!欧本VS闪鱼VS格行随身wifi哪款更好用?欧本随身wifi靠谱吗?

最近小编后台私信快被问爆了&#xff0c;都想让测评一下自己相中的随身wifi到底行不行。该说不说随身wifi品牌真是越来越多了&#xff0c;今天就挑选咨询量最多的三款&#xff1a;格行&#xff0c;欧本&#xff0c;闪鱼&#xff01;咱们各方面都实测一下&#xff0c;看看哪款更…

基于ucos-ii操作系统的生产者消费者-问题

目 录 第1章 题目分析. 1 1.1 生产者线程... 1 1.2 消费者线程... 1 1.3 缓冲区... 1 1.4 进程的同步与互斥... 1 第2章 解决方案. 2 2.1 总体方案... 2 2.2 生产者问题... 2 2.3 消费者问题... 3 2.4 进程问题... 5 第3章 实验结果. 6 3.1 运行结果... 6 3.2 结果分析... 8 第…

提取 Chrome、Firefox 中储存的用户密码用于凭据发现

操作环境 Chrome 浏览器 Version 125.0.6422.112 (Official Build) (64-bit)Firefox 浏览器 Version 126.0 (64 位) Chrome 浏览器储存密钥原理 新的 Chrome 浏览器储存密码的方案是使用 Chrome 生成的 AES 密钥对用户密码进行加密之后储存在 Sqlite 数据库文件中&#xff0c;A…

Linux 内核之 mmap 内存映射的原理及源码解析

文章目录 前言一、简介1. mmap 是什么&#xff1f;2. Linux 进程虚拟内存空间 二、mmap 内存映射1. mmap 内存映射的实现过程2. mmap 内存映射流程2.1 mmap 系统调用函数2.2 ksys_mmap_pgoff 函数2.3 vm_mmap_pgoff 函数2.4 do_mmap_pgoff 函数2.5 do_mmap 函数2.6 get_unmappe…

私域流量的真谛:构建并运营属于你自己的私域生态

大家好&#xff0c;我是来自一家专注于私域电商行业的软件开发公司的产品经理&#xff0c;拥有超过七年的行业经验。今天&#xff0c;我想和大家聊聊私域流量的真正含义&#xff0c;以及为何我们应该关注并努力打造属于自己的私域生态。 什么是私域流量&#xff1f; 私域流量&…

HCIA第二天复习上

延长传输距离-------中继器&#xff08;放大器&#xff09;------物理层设备 可以延长5倍传输距离 增加网络节点数量 网络拓扑结构 1直线型拓扑 信息安全性差 网络延迟高传输速度慢 2环形拓扑 3星型拓扑 4网状型拓扑 传输效率高&#xff0c;…

【字典树 马拉车算法】336. 回文对

本文涉及知识点 字典树 马拉车算法 336. 回文对 给定一个由唯一字符串构成的 0 索引 数组 words 。 回文对 是一对整数 (i, j) &#xff0c;满足以下条件&#xff1a; 0 < i, j < words.length&#xff0c;i ! j &#xff0c;并且words[i] words[j]&#xff08;两个字…

通过注意力调节实现更好的文本到图像生成对齐

近年来&#xff0c;生成性AI技术在众多领域取得了前所未有的进步。大规模预训练模型的出现激发了各种下游任务中的新应用。这在文本到图像生成领域尤为明显&#xff0c;例如Stable Diffusion、DALL-E 2和Imagen等模型已经显著展示了它们的能力。尽管如此&#xff0c;复杂提示中…

appium篇-windows桌面自动化(一)[环境配置]

1、windows版本&#xff1a;win10 2、winSdk版本 Windows SDK and emulator archive | Microsoft Developer 3、winAppDriver版本 1.2.99 Releases microsoft/WinAppDriver (github.com) ################ 4、python版本 Python 3.9.13 ############### 5、appium版本 Re…

hubilder Android模拟器华为手机连接不上

APP真机测试注意点&#xff1a; 1. 同一个局域网下 2. 手机连接USB模式&#xff08;华为选择USB配置&#xff1a;音频来源&#xff09; &#xff0c;开发者模式 3. 实在不行重启HBuilderX再运行真机 可是卡在了“正在安装手机端HBuilder调试基座...” 就没反应了&#xff1f;&…

【高时效通路】

一 高时效通路 1.1 pathchdumper 实时数据拉取、实时数据处理、5分钟微批dump来加速时效性&#xff0c;具体来说&#xff1a; 实时数据拉取&#xff08;Fetcher&#xff09;&#xff1a;基于Databus Fetcher基建&#xff0c;直接对接F0层实时拉取最新数据&#xff0c;保证该…

Springboot整合Minio对象存储超级详细讲解以及配置搭建

windows环境下搭建minio步骤 1.从minio官网进行查看详细信息 地址&#xff1a;https://min.io/里面有详细的配置信息搭建成功之后如下如所示&#xff1a;用户名密码默认情况下为 username&#xff1a;minioadmin password&#xff1a;minioadmin2.搭建成功之后的访问 地址&…

vue项目实战 - 如果高效的实现防抖和节流

在Vue项目中&#xff0c;处理高频事件的优化至关重要&#xff0c;直接影响用户体验和应用性能。防抖&#xff08;Debounce&#xff09;和节流&#xff08;Throttle&#xff09;是两种常用且有效的方法&#xff0c;可以控制事件触发频率&#xff0c;减少不必要的资源消耗。如何在…

SEO优化,小白程序员如何做SEO优化流量从0到1

原文链接&#xff1a;SEO优化&#xff0c;小白程序员如何做SEO优化流量从0到1 1、SEO是什么&#xff1f; SEO即&#xff1a;搜索引擎优化(Search Engine Optimization)&#xff0c;是一种通过优化网站结构、内容和外部链接等因素&#xff0c;提高网站在搜索引擎中的自然排名&…

DeepDriving | CUDA编程-03:线程层级

本文来源公众号“DeepDriving”&#xff0c;仅用于学术分享&#xff0c;侵权删&#xff0c;干货满满。 原文链接&#xff1a;CUDA编程-03:线程层级 DeepDriving | CUDA编程-01&#xff1a; 搭建CUDA编程环境-CSDN博客 DeepDriving | CUDA编程-02&#xff1a; 初识CUDA编程-C…

Linux之共享内存mmap用法实例(六十三)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

外卖霸王餐返利外卖会员卡小程序开发

外卖霸王餐返利外卖会员卡小程序开发 "社交电商赋能下的外卖返利小程序"是专为商家与用户双赢而设计的创新平台。 以下是其开发方案的详细步骤&#xff1a; 一、需求梳理&#xff1a;首先&#xff0c;我们需要明确小程序的核心功能和特色。包括设定活动类型、返利…