Почему выполнение «docker exec» убивает мой сеанс SSH?

#bash #docker #ssh #docker-exec

#bash #докер #ssh #docker-exec

Вопрос:

Допустим, у меня есть два сервера, A и B . У меня также есть bash скрипт, который выполняется на сервере A , который выглядит следующим образом:

build_test.sh

 #!/bin/bash
ssh user@B <<'ENDSSH'
echo "doing test"
bash -ex test.sh
echo "completed test"
ENDSSH
 

test.sh

 #!/bin/bash
docker exec -i my_container /bin/bash -c "echo hi!"
 

Проблема в том, что completed test он не выводится на терминал.

Вот результат выполнения build_test.sh :

 $ ./build_test
doing test
  docker exec -i my_container /bin/bash -c "echo hi!"
hi!
 

Я ожидаю completed test вывода после hi! , но это не так. Как мне это исправить?

Комментарии:

1. docker вероятно, потребляет остальную часть стандартного ввода, от которого он наследует ssh (это скрипт, который вы пытаетесь запустить).

2. Если да, есть ли какой-нибудь способ сказать docker не делать этого?

3. docker ... < /dev/null .

4. Это сработало! Сделайте это ответом, и я приму его.

5. Вы также можете удалить -i флаг.

Ответ №1:

docker использует, хотя и не использует, свой стандартный ввод, от которого он наследует test.sh . test.sh наследует его стандартный ввод от bash , который наследует его стандартный ввод от ssh . Это означает, что docker само по себе считывает последнюю строку скрипта до того, как удаленная оболочка сможет.

Чтобы исправить, просто перенаправьте стандартный ввод docker с /dev/null .

 docker exec -i my_container /bin/bash -c "echo hi!" < /dev/null