博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
docker 容器开发
阅读量:6504 次
发布时间:2019-06-24

本文共 2961 字,大约阅读时间需要 9 分钟。

hot3.png

package mainimport (        "fmt"        "os"        "os/exec"        "os/user"        "path/filepath"        "strconv"        "syscall")func main() {        switch os.Args[1] {        case "run":                parent()        case "child":                child()        default:                panic("what should i do?")        }}func parent() {        cmd := exec.Command("/proc/self/exe", append([]string{"child"}, os.Args[2:]...)...)        cmd.SysProcAttr = &syscall.SysProcAttr{}        cmd.SysProcAttr.Cloneflags = syscall.CLONE_NEWUSER | syscall.CLONE_NEWNS | syscall.CLONE_NEWUTS | syscall.CLONE_NEWPID | syscall.CLONE_NEWNET | syscall.CLONE_NEWNS        cmd.SysProcAttr.Credential = &syscall.Credential{                Uid: 0,                Gid: 0,        }        curuser, _ := user.Current()        uid, _ := strconv.Atoi(curuser.Uid)        gid, _ := strconv.Atoi(curuser.Gid)        cmd.SysProcAttr.UidMappings = []syscall.SysProcIDMap{
{ContainerID: 0, HostID: uid, Size: 1}} cmd.SysProcAttr.GidMappings = []syscall.SysProcIDMap{
{ContainerID: 0, HostID: gid, Size: 1}} cmd.Stdin = os.Stdin cmd.Stderr = os.Stderr cmd.Stdout = os.Stdout if err := cmd.Run(); err != nil { panic(err) os.Exit(-1) }}func pivotRoot(root string) error { if err := syscall.Mount(root, root, "bind", syscall.MS_BIND|syscall.MS_REC, ""); err != nil { return fmt.Errorf("Mount rootfs to itself error :v%", err) } pivotDir := filepath.Join(root, ".pivot_root") if _, err := os.Stat(pivotDir); os.IsNotExist(err) { if err := os.Mkdir(pivotDir, 0700); err != nil { return err } } if err := syscall.PivotRoot(root, pivotDir); err != nil { return fmt.Errorf("pivot_root %v", err) } os.Chdir("/home/") #容器启动后指定工作路径 pivotDir = filepath.Join("/", ".pivot_root") if err := syscall.Unmount(pivotDir, syscall.MNT_DETACH); err != nil { return fmt.Errorf("unmount pivot_root dir %v", err) } return nil}func child() { pwd, _ := os.Getwd() fmt.Println(pwd) rootfs := filepath.Join(pwd, "rootfs") fmt.Println(rootfs) if err := pivotRoot(rootfs); err != nil { fmt.Printf("Error runing pivot_root - %s \n", err) os.Exit(-1) } defaultMountFlags := syscall.MS_NOEXEC | syscall.MS_NOSUID | syscall.MS_NODEV syscall.Mount("proc", "/proc", "proc", uintptr(defaultMountFlags), "") cmd := exec.Command(os.Args[2], os.Args[3:]...) cmd.Stdin = os.Stdin cmd.Stdout = os.Stdout cmd.Stderr = os.Stderr if err := cmd.Run(); err != nil { fmt.Errorf("ERROR", err) os.Exit(-1) }}

参考:https://blog.csdn.net/quqi99/article/details/77931497

转载于:https://my.oschina.net/u/4038454/blog/3011317

你可能感兴趣的文章
神秘函件引发的4G+与全网通的较量
查看>>
CloudCC:智能CRM究竟能否成为下一个行业风口?
查看>>
高德开放平台推出LBS游戏行业解决方案提供专业地图平台能力支持
查看>>
追求绿色数据中心
查看>>
Web开发初学指南
查看>>
OpenStack Days China:华云数据CTO郑军分享OpenStack创新实践
查看>>
探寻光存储没落的真正原因
查看>>
高通64位ARMv8系列服务器芯片商标命名:Centriq
查看>>
中国人工智能学会通讯——融合经济学原理的个性化推荐 1.1 互联网经济系统的基本问题...
查看>>
盘点大数据商业智能的十大戒律
查看>>
戴尔为保护数据安全 推出新款服务器PowerEdge T30
查看>>
今年以来硅晶圆涨幅约达40%
查看>>
构建智能的新一代网络——专访Mellanox市场部副总裁 Gilad Shainer
查看>>
《数字视频和高清:算法和接口》一导读
查看>>
《中国人工智能学会通讯》——6.6 实体消歧技术研究
查看>>
如何在Windows查看端口占用情况及查杀进程
查看>>
云存储应用Upthere获7700万美元股权债务融资
查看>>
国家互联网应急中心何世平博士主题演讲
查看>>
洗茶,你误会了多少年?
查看>>
移动大数据“后市场”受青睐 亟需数据深度学习人才
查看>>