golang 来自Scratch的容器 - 在Go中实现简单的容器化应用程序

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了golang 来自Scratch的容器 - 在Go中实现简单的容器化应用程序相关的知识,希望对你有一定的参考价值。

package main

import (
	"fmt"
	"os"
	"os/exec"
	"syscall"
)

func main() {
	switch os.Args[1] {
	case "run":
		parent()
	case "child":
		child()
	default:
		panic("wat should I do")
	}
}

func parent() {
	cmd := exec.Command("/proc/self/exe", append([]string{"child"}, os.Args[2:]...)...)
	cmd.SysProcAttr = &syscall.SysProcAttr{
		Cloneflags: syscall.CLONE_NEWUTS | syscall.CLONE_NEWPID | syscall.CLONE_NEWNS,
	}
	cmd.Stdin = os.Stdin
	cmd.Stdout = os.Stdout
	cmd.Stderr = os.Stderr

	if err := cmd.Run(); err != nil {
		fmt.Println("ERROR", err)
		os.Exit(1)
	}
}

func child() {
	must(syscall.Mount("rootfs", "rootfs", "", syscall.MS_BIND, ""))
	must(os.MkdirAll("rootfs/oldrootfs", 0700))
	must(syscall.PivotRoot("rootfs", "rootfs/oldrootfs"))
	must(os.Chdir("/"))

	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.Println("ERROR", err)
		os.Exit(1)
	}
}

func must(err error) {
	if err != nil {
		panic(err)
	}
}

golang go中的样本整数struct容器

package main
//go program to implement a portable VM

import (
    "fmt"
)
//int object struct
type Int struct {
	value []int
}
//constructor for int struct
func CreateInt(val int) Int {
	num := Int{value:[]int{val}}
	return num
}

//adds an integer to the struct
func (in Int) Addto(amount int) {
	in.value[0] += amount
}



func main(){
	tester := CreateInt(8)
	tester.Addto(7)
	fmt.Println(tester)
	//{[15]}
	fmt.Println(len(tester.value))
	//1
}

以上是关于golang 来自Scratch的容器 - 在Go中实现简单的容器化应用程序的主要内容,如果未能解决你的问题,请参考以下文章

golang go中的样本整数struct容器

Golang Kubenetes容器多集群平台开发实践

Go语言入门150题L1-066 猫是液体 (5 分) Go语言 | Golang

go-elasticsearch 来自官当的 golang es client

Golang basic_leaming2 语言容器

Golang basic_leaming2 语言容器