Я пишу Go функцию для загрузки локальных Docker изображений в экземпляр, который имеет доступ S SH. Для этого я использую следующий метод:
cmdSave := exec.Command("docker", "save", image)
cmdLoad := exec.Command("ssh", fmt.Sprintf("%s@%s", user, externalIP), "docker load")
read, write := io.Pipe()
cmdSave.Stdout = write
cmdLoad.Stdin = read
var buffer bytes.Buffer
cmdLoad.Stdout = &buffer
var stderrSave bytes.Buffer
cmdSave.Stderr = &stderrSave
var stderrLoad bytes.Buffer
cmdLoad.Stderr = &stderrLoad
err = cmdSave.Start()
if err != nil {
return errors.Wrap(err, stderrSave.String())
}
err = cmdLoad.Start()
if err != nil {
return errors.Wrap(err, stderrLoad.String())
}
err = cmdSave.Wait()
if err != nil {
return errors.Wrap(err, stderrSave.String())
}
err = write.Close()
if err != nil {
return err
}
err = cmdLoad.Wait()
if err != nil {
return errors.Wrap(err, stderrLoad.String())
}
_, err = io.Copy(os.Stdout, &buffer)
if err != nil {
return err
}
Однако из-за того, как команды передаются по конвейеру, возникает проблема, например, с ключом S SH или WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!
, когда SSH к экземпляру, функции просто бесконечно зависают на cmdSave.Wait (), и никакой вывод не отображается, оставляя пользователя не знающим, в чем проблема.
Есть ли способ сделать это так, чтобы вывод не проглатывался, а функция не оставалась зависшей?