#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