在docker中運行fork進程的go程序時:
/*
UTS Namespace主要用來隔離nodename和domainname兩個系統標識。在UTS namespace里,每個namespace允許有自己的hostname。
系統API 中的clone()創建新的進程。根據填入的參數來判斷哪些namesapce會被創建,而且它們的子進程也會被包含到這些namespace中。
*/
package main
import (
"os/exec"
"syscall"
"os"
"log"
)
func main(){
cmd := exec.Command("sh") // 指定被fork出來的新進程內的初始命令
cmd.SysProcAttr = &syscall.SysProcAttr{
Cloneflags: syscall.CLONE_NEWUTS, //使用CLONE_NEWUTS標識來創建一個UTC namesapce
}
cmd.Stdin = os.Stdin
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
if err := cmd.Run(); err != nil {//go封裝了對於系統clone()函數的調用,這段代碼執行后會進入一個sh運行環境中
log.Fatal(err)
}
}
遇到錯誤:
fork/exec /bin/sh: operation not permitted
這是因為docker沒有root權限進行進程fork,通過在docker run的時候加入--privileged參數即可解決。
