我正在嘗試實(shí)現(xiàn)一些效果docker run并docker exec使用libcontainer.我已經(jīng)能夠使用以下代碼創(chuàng)建一個(gè)容器并在其中運(yùn)行一個(gè)進(jìn)程:func Run(id string, s *specs.LinuxSpec, f *Factory) (int, error) { ... container, err := f.CreateContainer(id, config) if err != nil { return -1, err } process := newProcess(s.Process) tty, err := newTty(s.Process.Terminal, process, rootuid) defer tty.Close() if err != nil { return -1, err } defer func() { if derr := Destroy(container); derr != nil { err = derr } }() handler := NewSignalHandler(tty) defer handler.Close() if err := container.Start(process); err != nil { return -1, err } return handler.forward(process)}這很好用(我相信),但是當(dāng)我必須在同一個(gè)容器中運(yùn)行另一個(gè)進(jìn)程時(shí),問(wèn)題就來(lái)了。例如,一個(gè)容器已經(jīng)在運(yùn)行(主進(jìn)程在前臺(tái)模式下運(yùn)行):我怎樣才能實(shí)現(xiàn) Docker 允許你做的事情docker exec?我有以下代碼:func Exec(container libcontainer.Container, process *libcontainer.Process, onData func(data []byte), onErr func(err error)) (int, error) { reader, writer := io.Pipe() process.Stdin = os.Stdin rootuid, err := container.Config().HostUID() if err != nil { return -1, err } tty, err := newTty(true, process, rootuid) defer tty.Close() if err != nil { return -1, err } handler := NewSignalHandler(tty) defer handler.Close() // Redirect process output process.Stdout = writer process.Stderr = writer // Todo: Fix this, it waits for the main process to exit before it starts if err := container.Start(process); err != nil { return -1, err } go func(reader io.Reader) { scanner := bufio.NewScanner(reader) for scanner.Scan() { onData(scanner.Bytes()) } if err := scanner.Err(); err != nil { onErr(err) } }(reader) return handler.forward(process)}這也有效,但問(wèn)題是:它在運(yùn)行之前等待主進(jìn)程退出。有時(shí)它會(huì)運(yùn)行,但是100%在運(yùn)行一個(gè)簡(jiǎn)單的whoami命令5 到 7 次調(diào)用該函數(shù)后,我的記憶就會(huì)消失。我很確定我做錯(cuò)了什么,我只是不知道是什么。還是我對(duì)容器的理解讓我失望?我用這個(gè)項(xiàng)目作為參考:https : //github.com/opencontainers/runc
Libcontainer - 在容器中運(yùn)行多個(gè)進(jìn)程
慕尼黑8549860
2021-11-08 18:16:58