「/proc/self/exe」を呼び出して、独自のレプリカをフォークする単一のオペレーティングシステムプロセスを実行するドッカーコンテナを実行したいと思います。このプロセスは、コンテナユーザー(システムユーザーまたはログインしたユーザーのうちより安全なユーザー)によって開始されます。そのために信じるCLONE_NEWUTSビットが設定されているファイルでプロセスを実行するか、スーパーユーザーにプロセスを開始させる必要があります。
sudo機能を持つユーザーを使用したくなく、ファイルにCAP_SYS_ADMINビットを設定したくありません。 CLONE_NEWUTS ビットには特定の機能がないためです。
以下はいくつかのコードです。
package main
import (
"os"
"os/exec"
"syscall"
"fmt"
)
func main() {
// this would not be a main, it would be a process listening on a channel piped into from serveHTTP
switch os.Args[1] {
case "run":
run()
case "child":
child()
default:
panic("Unknown command")
}
}
func run() {
// fork a _clone_ process off in the command (execute the self process)
cmd := exec.Command("/proc/self/exe", append([]string{"child"}, os.Args[2:]...)...)
cmd.Stdin = os.Stdin
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
cmd.SysProcAttr = &syscall.SysProcAttr{
Cloneflags: syscall.CLONE_NEWUTS | syscall.CLONE_NEWPID,
}
if err := cmd.Run(); err != nil {
panic(err)
}
}
func child() {
// this would be one of the action functions
fmt.Printf("running %v as %v\n", os.Args[2:], os.Getpid())
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 {
panic(err)
}
}
すばらしい講演からもたらされましたが、今はリンクが見つかりません。他の機械の記録にあります。
この誤って表現された質問から:スーパーユーザー以外の実行プロセスが自分でフォークして複製することを許可する(重複可能)@sourcejediは私の計画で上記の問題を部分的に明確に説明しました。