[Tips] docker 中遇到fork/exec /bin/sh: operation not permitted錯誤


在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參數即可解決。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM