从零自制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后台运行的话不能删除cgroupwrite_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.Stdincommand.Stdout=os.Stdoutcommand.Stderr=os.Stderrlog.Info(command)log.Infof("sucess create a contain process")command.ExtraFiles=[]*os.File{readpipe}mntURL := "./merged"rootURL := "./"command.Dir = mntURLprepare_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进程在后台运行
`
在这里插入图片描述

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

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

相关文章

Rocky Linux 9.4 正式版发布 - RHEL 100% 1:1 兼容免费发行版

Rocky Linux 9.4 正式版发布 - RHEL 100% 1:1 兼容免费发行版 Rocky Linux 由 CentOS 项目的创始人 Gregory Kurtzer 领导 请访问原文链接&#xff1a;Rocky Linux 9.4 正式版发布 - RHEL 100% 1:1 兼容免费发行版&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处…

GPT-4o: 未来的智能助手

GPT-4o: 未来的智能助手 在这个信息爆炸的时代&#xff0c;人工智能&#xff08;AI&#xff09;已经成为我们生活中不可或缺的一部分。作为OpenAI最新推出的语言模型&#xff0c;GPT-4o不仅继承了前几代模型的优点&#xff0c;还在多个方面进行了显著的提升。本文将带你深入了解…

DreamerV3阅读笔记

DreamerV3 文章希望解决的一个挑战是用固定的hyperparameter来同时处理不同domain的任务。文章发现&#xff0c;通过结合KL balancing 和free bits可以使得world model learn without tuning&#xff08;是指上面这件事&#xff0c;即不需要对不同任务改变hyperparameter&#…

2024年电工杯高校数学建模竞赛(B题) 建模解析| 大学生平衡膳食食谱的优化设计

问题重述及方法概述 问题1&#xff1a;膳食食谱的营养分析评价及调整 数学方法&#xff1a;线性规划模型、营养素评价模型、比较分析 可视化数据图&#xff1a;营养素含量表、营养素摄入量对比图、营养素缺乏情况图 问题2&#xff1a;基于附件3的日平衡膳食食谱的优化设计 数…

KingbaseES数据库物理备份还原sys_rman

数据库版本&#xff1a;KingbaseES V008R006C008B0014 简介 sys_rman 是 KingbaseES 数据库中重要的物理备份还原工具&#xff0c;支持不同类型的全量备份、差异备份、增量备份&#xff0c;保证数据库在遇到故障时及时使用 sys_rman 来恢复到数据库先前状态。 文章目录如下 1.…

揭秘爬虫技术:从请求到存储的全方位解析

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、爬虫初探&#xff1a;请求与响应 二、数据解析&#xff1a;从混乱中提炼价值 三、数据…

Megatron-LM源码系列(八): Context Parallel并行

1. Context Parallel并行原理介绍 megatron中的context并行(简称CP)与sequence并行(简称SP)不同点在于&#xff0c;SP只针对Layernorm和Dropout输出的activation在sequence维度上进行切分&#xff0c;CP则是对所有的input输入和所有的输出activation在sequence维度上进行切分&…

M00238-固定翼无人机集群飞行仿真平台MATLAB完整代码含效果

一个小型无人机集群仿真演示平台&#xff0c;使用matlab和simulink搭建。 给出的例子是5架的&#xff0c;当然如果你愿意花时间&#xff0c;也可以把它扩展到10架&#xff0c;20架甚至更多。 输入&#xff1a;5架飞机的规划路径 输出&#xff1a;每架无人机每个时刻的13个状态量…

Docker环境安装并使用Elasticsearch

1、拉取es docker pull elasticsearch:7.10.12、查看镜像 docker images3、启动es docker run -d --name esearch -p 9200:9200 -p 9300:9300 elasticsearch:7.10.14、如果启动ES时出现一下问题 Unable to find image docker.elastic.co/elasticsearch/elasticsearch:7.10.…

python max_min标准化

python max_min标准化 max_min标准化sklearn实现max_min标准化手动实现max_min标准化 max_min标准化 Max-Min标准化&#xff08;也称为归一化或Min-Max Scaling&#xff09;是一种将数据缩放到特定范围&#xff08;通常是0到1&#xff09;的标准化方法。这种方法通过线性变换将…

用PhpStudy在本地电脑搭建WordPress网站教程(2024版)

对新手来说&#xff0c;明白了建站3要素后&#xff0c;如果直接购买域名、空间去建站&#xff0c;因为不熟练&#xff0c;反复测试主题、框架、插件等费时费力&#xff0c;等网站建成可能要两三个月&#xff0c;白白损失这段时间的建站费用。那么新手怎么建测试网站来练手呢&am…

06.部署jpress

安装mariadb数据 yum -y install mariadb-server #启动并设置开启自启动 systemctl start mariadb.service systemctl enable mariadb.service数据库准备 [rootweb01 ~]# mysql Welcome to the MariaDB monitor. Commands end with ; or \g. Your MariaDB connection id…

OpenAI 再次刷新认知边界:GPT-4 颠覆语音助手市场,流畅度直逼真人互动?

前言 近日&#xff0c;美国人工智能研究公司 OpenAI 发布了其最新旗舰模型 GPT-4o&#xff0c;这一革命性的进展不仅标志着人工智能领域的新突破&#xff0c;更预示着即将步入一个全新的交互时代&#xff1f;GPT-4o 的发布&#xff0c;对于我们来说&#xff0c;意味着人工智能…

冯喜运:5.28黄金今日走势分析及黄金原油操作策略

【黄金消息面分析】&#xff1a;周一&#xff08;5月27日&#xff09;美盘时段&#xff0c;现货黄金止跌回稳&#xff0c;缓慢回升&#xff0c;盘中最高触及2358.4美元。美国商品期货交易委员会(Commodity Futures Trading Commission)的最新交易数据显示&#xff0c;对黄金的投…

空压机的热回收原理介绍

空压机运行时会产生大量的压缩热&#xff0c;通常这部分能量通过机组的风冷或水冷系统释放到大气当中。压缩机的热回收是持续降低空气系统损耗&#xff0c;提高客户生产力的必要手段。 余热回收的节能技术目前研究很多&#xff0c;但大多只针对喷油螺杆式空压机的油路改造而言…

Eureka全面解析:轻松实现高效服务发现与治理!

一、引言 Eureka是Netflix开源的一款服务发现框架&#xff0c;它提供了一种高效的服务注册和发现机制&#xff0c;适用于大规模分布式系统。本文将详细介绍Eureka的相关知识。 二、Eureka简介 Eureka是一个基于REST的服务发现框架&#xff0c;它提供了一种简单的服务注册和发…

如果创办Google

本文是一篇演讲稿&#xff0c;来自于《黑客与画家》一书的作者保罗*格雷厄姆&#xff0c;被称为硅谷创业之父。这是他为14至15岁的孩子们做的一次演讲&#xff0c;内容是关于如果他们将来想创立一家创业公司&#xff0c;现在应该做些什么。很多学校认为应该向学生们传授一些有关…

ADS基础教程15 - 设计加密保护IP

设计加密保护IP 一、引言二、IP的生成与调用1.IP生成2.IP的调用 一、引言 介绍如何ADS中如何对设计好的原理图进行加密形成IP&#xff0c;然偶进行调用的过程。 二、IP的生成与调用 1.IP生成 (1)选择一个已经调试好的原理图&#xff0c;在菜单栏中选择Tools–>Encode De…

python中import的搜索路径

文章目录 前言 一 python中import的搜索路径1. python中import的搜索路径先判断是否内置模块根据sys.path查找1.1 脚本当前目录和所属项目目录1.2 环境变量1.3 标准库1.4 .pth 文件1.5 第三方库 2. 解决ModuleNotFoundError 前言 码python时经常会遇到找不到包或者找不到模块的…

OpenWrt 23.05 安装之后默认空间小 磁盘扩容 教程 软路由实测 系列六

1 安装fdisk opkg update opkg install fdisk #查看磁盘 rootOpenWrt:~# fdisk -l GPT PMBR size mismatch (246303 ! 250069679) will be corrected by write. The backup GPT table is not on the end of the device. Disk /dev/sda: 119.24 GiB, 128035676160 bytes, 25006…