从零自制docker-15-【实现 mydocker run -d 支持后台运行容器】

文章目录

  • 实现目的
  • 莫名奇妙的问题
  • 对之前upper层出现root补充
  • 对run某些命令出现找不到文件或目录的原因
  • 代码
  • 效果

实现目的

docker run -d时容器在后台运行,而不会进入命令行交互形式

  1. 首先是需要添加-d选项
  2. 然后设置当添加-d选项时候主进程不会等待子进程,而是直接结束
func Contain_run(cmd string,it bool,resource_config *cgroups.Resource,volume string) {
	command,writepipe,rooturl:=new_contain_process(it,volume)
	log.Infof("cmd %s it %t",cmd,it)
	
	if err:=command.Start();err!=nil{
		log.Error(err)
	}
	log.Infof("cmd %s",cmd)
	cmdstring:=strings.Split(cmd, " ")
	log.Infof("split cmd %v",cmdstring)

	llkdockercgroups:=cgroups.Cgroups{
		Cgroups_Name: "llkdockercgroups",
		Resour:resource_config,
		Sub:cgroups.Subsystemins,
	}
	log.Info(llkdockercgroups.Resour)

	cgroups_path:=cgroups.Get_cgroups_path("cgroup",llkdockercgroups.Cgroups_Name)
	log.Info("in run.go get cgroups_path")
	llkdockercgroups.Move(command.Process.Pid,cgroups_path)

	llkdockercgroups.Set(cgroups_path)
	//defer llkdockercgroups.Remove(cgroups_path) //-d后台运行的话不能删除cgroup

	write_to_pipe(cmdstring,writepipe)
	if it{ //-it实现交互,那么当前终端就不能关闭退出,还需留给子进程使用
		command.Wait()
		// 从容器内的命令行中的退出才会wait结束
		end_volume(rooturl,volume)
		end_overlays(rooturl)
	}
	
	log.Infof("exit  !!!")

}
  1. 最后注意主进程不能删除该进程建立的cgroup,否则会出现下述问题,这个是删除cgroup出现的问题,原因是这个cgroup还包含一些正在运行的进程,那些进程没有结束就删除cgroup会删除失败
    在这里插入图片描述

解决方法:就是在-it的模式下最后删除,但后台运行的不会

if it{ //-it实现交互,那么当前终端就不能关闭退出,还需留给子进程使用
		command.Wait()
		// 从容器内的命令行中的退出才会wait结束
		end_volume(rooturl,volume)
		end_overlays(rooturl)
		llkdockercgroups.Remove(cgroups_path) //-d后台运行的话不能删除cgroup
	}

这个是后台运行docker的
在这里插入图片描述
而最后通过-it运行的结果如下
在这里插入图片描述

莫名奇妙的问题

发现调试的时候,使用log.Infof等其他类似的,最后终端上没有显示全,但通ps -ef|grep -e PPID -e top查看发现其又确实在在运行

例如下面这个9550进程是后台运行的top进程
在这里插入图片描述
但在终端上显示时有时不全,有时也会显示全
在这里插入图片描述
这里我是开了子进程的和当前终端的标准输入输出和错误都一样的,不然看不到相关调试信息

func new_contain_process(it bool,volume string)  (*exec.Cmd,*os.File,string){	
	
	readpipe,writepipe,err:=os.Pipe()
	if err!=nil{
		log.Fatal(err)
	}
	command:=exec.Command("/proc/self/exe","init")
	command.SysProcAttr=&syscall.SysProcAttr{
		Cloneflags: syscall.CLONE_NEWUTS | syscall.CLONE_NEWPID | syscall.CLONE_NEWNS |
			syscall.CLONE_NEWNET | syscall.CLONE_NEWIPC,
	}
	 //主进程和子进程共用一个终端
		command.Stdin=os.Stdin
		command.Stdout=os.Stdout
		command.Stderr=os.Stderr
	
	log.Info(command)
	log.Infof("sucess create a contain process")
	command.ExtraFiles=[]*os.File{readpipe}
	mntURL := "./merged"
	rootURL := "./"
	command.Dir = mntURL
	prepare_overlays(rootURL) 
	prepare_volume(rootURL,volume)

	log.Info(readpipe)
	return command,writepipe,rootURL
	
}

对之前upper层出现root补充

之前一直是对上一个写的docker复制然后在复制的上面写新的,发现busybox和刚从busybox解压得到缺少了很多东西,然后又重新解压生成了busybox将其使用。然后之前在后面发现upper中出现root是调用相关命令就会出现root,但当时没有啥修改的文件,这次全的busybox发现出现了下面的这个,那么确实就是因为调用命令引起的日志记录的变化导致的
在这里插入图片描述

对run某些命令出现找不到文件或目录的原因

当时是容器在挂载前就找相关命令,找到的这个是宿主机上的,但我们要的是在pivoroot后的根目录下的相关命令的路径,所以后面运行这个宿主机上的路径会显示路径找不到,因为此时是以容器的根目录为相对参考


func Contain_init(){
	
	
	cmd:=readpipe()
	log.Infof("init %s",cmd)
	
	log.Infof("cmd[0] %s",cmd[0]=="/bin/sh")
	log.Infof("cmd len %d",len(cmd))
	log.Infof("cmd %s",cmd[0])
	/*
	path,err:=exec.LookPath(cmd[0])//挂载前得到相关命令的路径会出现找不到
	if err!=nil{
		log.Fatal(err)
	}
	argv:=[]string{}
    for i:=1;i<len(cmd);i++{
		argv=append(argv,cmd[i-1])
	}*/

	log.Infof("prepare for mount ")

	mount()
	path,err:=exec.LookPath(cmd[0]) //挂载后再得到相关命令的路径等
	if err!=nil{
		log.Fatal(err)
	}
	argv:=[]string{}
    for i:=1;i<len(cmd);i++{
		argv=append(argv,cmd[i-1])
	}


	log.Infof("prepare for exec cmd ")
	log.Info(path)
	log.Info(argv)
	log.Info(os.Environ())

	if err:=syscall.Exec(path,argv,os.Environ());err!=nil{
		log.Infof("exec error")
		log.Info(err)
	}
	
}

代码

https://github.com/FULLK/llkdocker/tree/main/run_d_docker

效果

最终我启动了sudo ./run_docker run -d top多次,在cgroup.procs中可以看到(一部分是之前sudo ./run_docker run -it /bin/sh加入的,因为我最后关闭了主进程最后自动删除cgroup的函数),最终可以看到top进程在后台运行
`
在这里插入图片描述

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

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

相关文章

下跌孕线烛台如何交易?昂首平台2步盈利

下跌孕线烛台如何交易&#xff1f;其实很简单&#xff0c;昂首平台2步盈利。发现下跌孕线烛台形态&#xff0c;在上升趋势即将终结时&#xff0c;当第二根烛线完全闭合&#xff0c;并跌破低点时&#xff0c;即可卖出。 将止损设在该模式的最高点上方。 设定止盈于最近的支撑位置…

早餐店燃气安全岂能马虎?探头选择与年检必须到位

在现代都市生活中&#xff0c;早餐店作为人们日常生活中的重要一环&#xff0c;其安全性问题日益受到人们的关注。其中&#xff0c;燃气泄漏引发的火灾和爆炸事故尤为令人担忧。 因此&#xff0c;点式可燃气体报警器在早餐店中的应用显得尤为重要。 在这篇文章中&#xff0c;…

C语言操作总结

1.函数指针变量&#xff1a;定义一个函数指针变量&#xff0c;通过函数指针变量操作这个函数。 int main&#xff08;&#xff09;&#xff5b; int funOpoint(int a,int b); int (*p)(int,int);//定义一个函数指针变量 p funOpoint; //将函数地址赋值给指针变量&#xff0c…

通付盾Web3专题 | SharkTeam:Web3常见钓鱼方式分析与安全防范建议

引言 Web3钓鱼是一种针对Web3用户的常见攻击手段&#xff0c;通过各种方式窃取用户的授权、签名&#xff0c;或诱导用户进行误操作&#xff0c;目的是盗窃用户钱包中的加密资产。 近年来&#xff0c;Web3钓鱼事件不断出现&#xff0c;且发展出钓鱼即服务的黑色产业链&#xf…

ARM IHI0069F GIC architecture specification (7)

3.1 GIC逻辑组件 GICv3体系结构由一组逻辑组件组成&#xff1a; •Distributor。 •每个受支持的PE都有一个Redistributor。 •支持的每个PE都有一个CPU interface。 •中断翻译服务组件&#xff08;ITS&#xff09;&#xff0c;支持将事件翻译为LPI。 Distri…

灌装线在线粒子浮游菌监测系统安装调试

近日&#xff0c;北京中邦兴业成功完成了某企业灌装线多个点位的洁净环境在线粒子浮游菌监测系统的施工并完成了前期的调试工作。 【项目现场】 北京中邦兴业技术工程师根据客户现场实际情况&#xff0c;进行了粒子、浮游菌的点位布置&#xff0c;此系统能够实时监测生产线上的…

面向对象编程的魅力与实战:以坦克飞机大战为例

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、面向对象编程的引言 二、理解面向对象编程与面向过程编程的差异 三、创建类与对象&…

计算机的存储体系

计算机的存储分为内存和硬盘两大类。其中内存属于非持久化的存储设备&#xff0c;用于临时存储数据&#xff0c;设备掉电后数据会丢失&#xff1b;硬盘属于持久化的存储设备&#xff0c;设备掉电后数据不会丢失。 实际上在计算机领域存储的种类是非常多的&#xff0c;业界有时…

猫咪掉毛严重怎么办?小米、希喂、霍尼韦尔宠物空气净化器测评

吸猫成瘾&#xff0c;养猫“致贫”&#xff1f;在当今社会&#xff0c;养猫已成为众多年轻人的一个追捧的事情。乖巧又可爱&#xff0c;下班回到家撸一把猫已经成为年轻人的日常。但是猫咪可爱也不影响它的各种养猫伴生的问题&#xff01;无论是漂浮的浮毛、飘散的皮屑还是偶发…

线程池(详细)

Java中的线程池是运用场景最多的并发框架&#xff0c;几乎所有需要异步或并发执行任务的程序都可以使用线程池。在开发过程中&#xff0c;合理地使用线程池能够带来3个好处。 第一&#xff1a;降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。 第二&…

数据安全革命:Web3带来的隐私保护创新

随着数字化时代的发展&#xff0c;数据安全和隐私保护问题日益突出。传统的中心化数据存储和管理方式已经无法满足日益增长的数据安全需求&#xff0c;而Web3作为下一代互联网的新兴力量&#xff0c;正以其去中心化、加密安全的特性&#xff0c;引领着一场数据安全革命。本文将…

【MySQL02】【 InnoDB 记录存储结构】

文章目录 一、前言二、InnoDB 行格式1. COMPACT 行格式1.1 记录的额外信息1.2 记录的真实数据1.3 综上 2. REDUNDANT 行格式2.1 字段长度偏移列表2.2 记录头信息 3. DYNAMIC 行格式和 COMPPESED 行格式 三、InnoDB 数据页结构1. File Header (文件头部)2. Page Header (页面头部…

vue3+vite解决项目打包后本地图片等资源找不到的问题

1.在vite.config.js里面做如下配置 import { defineConfig } from vite import vue from vitejs/plugin-vueexport default defineConfig({base: ./, // 打包的静态资源引用路径plugins: [vue()], // 放插件用的resolve: {alias: {: /src // 配置/提示符}}, })上述配置主要就是…

Samtec技术漫谈 | 电动自行车中的传感器和信号传输技术

【摘要/前言】 电动自行车&#xff0c;大家熟悉吗&#xff1f; 今天的话题似乎是可以唤起大家心底骑车的美好回忆&#xff0c;我们也曾骑车探索过大自然和社区&#xff0c;自行车也是我们曾经不可或缺的便捷交通工具。 怀旧思潮的影响&#xff0c;加持科技的进步&#xff0c…

备忘录可以统计字数吗?备忘录里在哪查看字数?

在这个信息爆炸的时代&#xff0c;很多人喜欢使用备忘录app来记录生活中的点点滴滴。备忘录不仅可以帮助我们记事、安排日程&#xff0c;还能提醒我们完成各种任务&#xff0c;是我们日常生活中不可或缺的小助手。 然而&#xff0c;在使用备忘录时&#xff0c;有时我们会遇到需…

软件工程基础

软件工程基础 甘特图&#xff08;Gantt Chart&#xff09; 关键字&#xff1a;开始、结束时间&#xff0c;并行关系 皮特图&#xff08;PERT Chart&#xff09; 关键字&#xff1a;开始、结束时间&#xff0c;依赖关系 黑盒测试 黑盒测试是一种软件测试方法&#xff0c;它专…

视频号小店应该怎么操作呢?不了解的小伙伴快来看!

大家好&#xff0c;我是电商小V 普通人想利用视频号小店赚钱&#xff0c;奈何自己不会直播&#xff0c;不会拍视频&#xff0c;那么普通人应该怎么在视频号中赚钱呢&#xff1f;今天咱们就来详细的说一下&#xff0c; 其实不直播&#xff0c;不拍视频也是可以在视频号上面卖货赚…

学校智慧公厕的有线与无线方案,怎样去选择才合适

在当今数字化时代&#xff0c;学校也在积极引入智慧公厕系统&#xff0c;以提升校园环境的舒适度和管理效率。然而&#xff0c;面对智慧公厕的有线与无线方案&#xff0c;如何做出合适的选择成为了一个关键问题。 一、智慧公厕无线方案优势 首先来看无线方案。如前文所述&#…

[SMB协议][问题][解决方法]电视访问共享视频 | 该共享设备尚未共享任何文件 | 音频格式不支持 | 播放卡顿

1.该共享设备尚未共享任何文件 | 一些智能电视&#xff08;比如价格比较美丽&#xff0c;或者比较老的&#xff09;兼容性可能较差&#xff0c; 1. 一般而言win 10默认关闭smb 1.0默认开启着smb 2.0&#xff0c;smb 1.0不安全&#xff0c;比较过时的技术&#xff0c;且微软建议…

SpringBoot 上传文件示例

示例效果&#xff1a; 前端代码&#xff1a; <html> <head><title>上传文件示例</title></head> <body> <h2>方式一&#xff1a;普通表单上传</h2> <form action"/admin/upload" method"post" enctyp…