"/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는 내 계획에서 위의 문제를 부분적으로 명확하게 설명했습니다.