запуск контейнера runc в автономном режиме go-lang

Я тестирую время запуска контейнера runc, используя автоматический скрипт go lang, мой код выглядит следующим образом, и он продолжает блокировать процесс, даже если он работает без блокировки в оболочке.

    command := exec.Command("runc","start","-d","redis")
    command.Dir = "/containers/redis"
    start := time.Now() 
    r,err:=command.CombinedOutput()
    duration:= time.Since(start)/time.Millisecond
    fmt.Println(duration)   
    fmt.Println(err) 
    fmt.Println(string(r))

person Docker hero    schedule 24.05.2016    source источник
comment
CombinedOutput блокируется до завершения процесса. Если не хотите блокировать, используйте Start()   -  person JimB    schedule 24.05.2016
comment
start запустит его в отдельном потоке, чтобы он не ждал, пока это будет сделано   -  person Docker hero    schedule 24.05.2016
comment
О, вы хотите, чтобы runc отсоединился, а не exec.Cmd (кстати, все подпроцессы управляются в отдельных потоках, но CombinedOutput вызывает Wait для вас). Я не слишком знаком с runc, контейнер зависит от консоли? В этом случае вы можете указать его с помощью --console.   -  person JimB    schedule 24.05.2016
comment
Нет, я создаю демонизированный контейнер, у которого нет консоли. Странно, что runc start -d -b /containers/redis redis работает нормально.   -  person Docker hero    schedule 24.05.2016


Ответы (1)


Когда вы запускаете подпроцесс из sh, он ожидает завершения дочернего процесса (используя что-то вроде waitpid()), а затем немедленно возвращается. stdout и stderr подпроцесса (и всех его дочерних элементов) будут записаны непосредственно на ваш терминал (а не через sh), даже после того, как sh вернется к подсказке. Это также то, что сделал бы .Start().

Когда вы используете .CombinedOutput(), вы ждете, пока stdout и stderr запущенного процесса (и всех его наследующих подпроцессов) не закроются. Даже если ваш непосредственный дочерний процесс (runc start) завершается, контейнер, который он запускает, все еще может иметь копию stdout и stderr и записывать в них, поэтому .CombinedOutput() не может вернуться, пока не будет уверен, что все копии этих файлов закрыты.

person apenwarr    schedule 02.01.2019