gpt4 book ai didi

go - 在 MacOS 上使用 Golang 创建容器 - syscall.CLONE_NEWUTS 不起作用

转载 作者:行者123 更新时间:2023-12-02 18:28:33 24 4
gpt4 key购买 nike

学习如何使用 MacOS 终端在 Golang 上实现容器,我正在尝试实现 Docker 上推广的以下代码:

unc main() {
switch os.Args[1] {
case "run":
run()
default:
panic("Bad Command")
}
}

func run() {
fmt.Printf("Running %v \n", os.Args[2:])
cmd := exec.Command(os.Args[2], os.Args[3:]...)
cmd.Stdin = os.Stdin
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
cmd.SysProcAttr = &syscall.SysProcAttr{
Cloneflags: syscall.CLONE_NEWUTS,
}
cmd.Run()
}

但是,syscall.CLONE_NEWUTS 似乎仅适用于 Linux。我如何在 Mac 上实现这个?

最佳答案

我手头没有 Macos,但如果您在 linx (ubuntu) 上遇到类似问题,请首先检查您是否以 root 身份运行 go run .

如果不是,则需要将额外的标志 (syscall.CLONE_NEWUSER) 传递到 SysProcAttr 中:

func run() {
fmt.Printf("Running %v \n", os.Args[2:])
cmd := exec.Command(os.Args[2], os.Args[3:]...)
cmd.Stdin = os.Stdin
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
cmd.SysProcAttr = &syscall.SysProcAttr{
Cloneflags: syscall.CLONE_NEWUTS | syscall.CLONE_NEWUSER,
}
cmd.Run()

我认为这里发生的情况是,如果没有 syscall.NEWUSER 标志,您将尝试将当前进程克隆为 root,但您没有这样做的权限。

顺便说一下,OPs 片段取自 https://www.youtube.com/watch?v=8fi7uSYlOdc (其中所有命令均以 root 用户身份运行)。

关于go - 在 MacOS 上使用 Golang 创建容器 - syscall.CLONE_NEWUTS 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69749508/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com