从零自制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 string
	for 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
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SA316系列音频传输模块-传输距离升级音质不打折

SA316是思为无线研发的一款远距离音频传输模块&#xff0c;音频采样率为48K&#xff0c;传输距离可达200M。为了满足更多用户需求&#xff0c;思为无线在SA316基础上进一步增加传输距离推出SA316F30。相比SA316性能&#xff0c;同样其采用48K采样&#xff0c;-96dBm灵敏度&…

[C][动态内存分配][柔性数组]详细讲解

目录 1.动态内存函数的介绍1.malloc2.free2.calloc4.realloc 2.常见的动态内存错误3.C/C程序的内存开辟4.柔性数组1.是什么&#xff1f;2.柔性数组的特点3.柔性数组的使用4.柔性数组的优势 1.动态内存函数的介绍 1.malloc 函数原型&#xff1a;void* malloc(size_t size)功能…

Linux网络编程:应用层协议|HTTP

前言&#xff1a; 我们知道OSI模型上层分为应用层、会话层和表示层&#xff0c;我们接下来要讲的是主流的应用层协议HTTP&#xff0c;为什么需要这个协议呢&#xff0c;因为在应用层由于操作系统的不同、开发人员使用的语言类型不同&#xff0c;当我们在传输结构化数据时&…

前端开发工程师——AngularJS

一.表达式和语句 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthdevice-w…

AI播客下载:Acquired podcast每个公司都有一个故事

"Acquired Podcast" 是一档专注于深度解析科技行业和企业发展历程的播客节目&#xff0c;由Ben Gilbert和David Rosenthal主持。其口号是&#xff1a;Every company has a story.《Acquired》每一集都围绕一个特定的主题或公司进行讨论。它以独特的视角和深入的分析&…

FFmpeg编解码的那些事(1)

看了网上很多ffmpeg的编解码的文章和代码&#xff0c;发现有很多文章和代码都过时了&#xff0c;主要还是ffmpeg有很多接口都已经发生变化了。 这里简单说一下&#xff0c;什么是编码和解码。 1.视频编码 对于视频来说&#xff0c;可以理解为多张&#xff08;rgb或者yuv&…

Numba 的 CUDA 示例(1/4):踏上并行之旅

按照本系列从头开始使用 Python 学习 CUDA 编程 介绍 GPU&#xff08;图形处理单元&#xff09;&#xff0c;顾名思义&#xff0c;最初是为计算机图形学开发的。从那时起&#xff0c;它们几乎在每个需要高计算吞吐量的领域都无处不在。这一进步得益于 GPGPU&#xff08;通用 G…

从零开始学React--环境搭建

React官网 快速入门 – React 中文文档 1.搭建环境 下载nodejs,双击安装 nodejs下载地址 更新npm npm install -g npm 设置npm源&#xff0c;加快下载速度 npm config set registry https://registry.npmmirror.com 创建一个react应用 npx create-react-app react-ba…

React-组件基础使用

组件是什么 概念&#xff1a;一个组件就是用户界面的一部分&#xff0c;它可以有自己的逻辑和外观&#xff0c;组件之间可以互相嵌套&#xff0c;也可以复用多次 组件化开发可以让开发者像搭积木一样构建一个完整的庞大的应用 React组件 在React中&#xff0c;一个组件就是首…

Rocksdb原理简介

100编程书屋_孔夫子旧书网 Rocksdb作为当下nosql中性能的代表被各个存储组件&#xff08;mysql、tikv、pmdk、bluestore&#xff09;作为存储引擎底座&#xff0c;其基于LSM tree的核心存储结构&#xff08;将随机写通过数据结构转化为顺序写&#xff09;来提供高性能的写吞吐时…

读人工智能时代与人类未来笔记17_人类未来

1. 人类未来 1.1. 在印刷读物出现之前&#xff0c;中世纪的欧洲人主要通过社区传统获取知识 1.1.1. 通过参与收割和季节轮作积累民间智慧 1.1.2. 在礼拜场所践行信仰并遵守圣礼 1.1.3. 加入行业公会&#xff0c;学习技术&…

重置服务器之后 SSH 登录报错:REMOTE HOST IDENTIFICATION HAS CHANGED!

问题原因&#xff1a; 报错是由于远程的主机的公钥发生了变化导致的。ssh服务是通过公钥和私钥来进行连接的&#xff0c;它会把每个曾经访问过计算机或服务器的公钥&#xff08;public key&#xff09;&#xff0c;记录在~/.ssh/known_hosts 中&#xff0c;当下次访问曾经访问…

量子密钥分发系统基础器件(一):光纤干涉仪

干涉仪的基本原理是利用波的叠加来获得波的相位信息&#xff0c;从而获取实验中所关心的物理量。光纤干涉仪是由光学干涉仪发展而来的&#xff0c;利用光纤实现光的干涉&#xff0c;由于光纤取代透镜系统构成的光路具有柔软、形状可随意变化、传输距离远等特点&#xff0c;当前…

MouseBoost Pro for Mac v3.4.7 鼠标右键助手 安装教程【支持M芯片】

MouseBoost Pro for Mac v3.4.7 鼠标右键助手 安装教程【支持M芯片】 原文地址&#xff1a;https://blog.csdn.net/weixin_48311847/article/details/139201501

电源模块测试系统怎么测试输入电压范围?

在现代电子设备中&#xff0c;电源模块的性能直接影响着整个系统的稳定性和效率。其中&#xff0c;电源输入电压范围是指电源能够接受的输入电压的最小值和最大值&#xff0c;它是确保电源正常工作的重要参数。为了提高测试效率和精度&#xff0c;自动化的测试方法逐渐取代了传…

《软件方法(下)》8.3.4.6 DDD话语“聚合”中的伪创新(1)

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 8.3 建模步骤C-2 识别类的关系 8.3.4 识别关联关系 8.3.4.6 DDD话语“聚合”中的伪创新 DDD话语中也有“聚合”。Eric Evans的“Domain-Driven Design: Tackling Complexity in the…

04--SpringBoot热部署与日志

1、热部署 1.1 引言 为了进一步提高开发效率&#xff0c;SpringBoot为我们提供了全部项目热部署&#xff0c;日后在开发过程中修改了部分代码或者相关配置文件之后&#xff0c;不需要再重启服务使其生效。在项目中开启了全局热部署之后&#xff0c;只需要在修改之后等待几秒钟…

气密检测中泄漏率的质量流量与体积流量的转换

对于R-134a等制冷剂&#xff0c;泄漏率通常表示为质量流量&#xff08;每年的逸出质量&#xff09;而不是体积流量&#xff08;特定时间段内给定压力下的逸出质量&#xff09;。因此&#xff0c;通过制冷剂的年泄漏量来定义泄漏级别&#xff0c;常用的单位为g/a。以某款车型为例…

Github 2024-05-29 C开源项目日报 Top10

根据Github Trendings的统计,今日(2024-05-29统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量C项目10C++项目3PHP项目1PHP:流行的Web开发脚本语言 创建周期:4710 天开发语言:C, PHP协议类型:OtherStar数量:37340 个Fork数量:7657 次…

从 0 手撸一个 pytorch

背景介绍 最近抽空看了下 Andrej Karpathy 的视频教程 building micrograd&#xff0c;教程的质量很高。教程不需要任何前置机器学习基础&#xff0c;只需要有高中水平的数学基础即可。整个教程从 0 到 1 手撸了一个类 pytorch 的机器学习库 micrograd&#xff0c;核心代码不到…