У меня есть докер-контейнер, который запускает Java-программу на переднем плане при запуске. Программа Java слушает ввод на stdin
. Как я могу программно отправить текст в java-программу?
Контейнер запускается с -it
, Так что я могу docker attach <container-name>
, введите мой текст, отправьте его с помощью ввода и отсоедините, используя ^p ^q
.
Я попытался docker exec <container-name> echo my-text
, но это выводится на стандартный вывод, а не на java-программу. Могу ли я как-нибудь передать это в java-программу?
Я также нашел аналогичный вопрос на форумах Docker, но решение использует screen
и я бы предпочел более чистое решение.
Я бы добавил это как комментарий к предыдущему ответу, но не могу из-за того, что являюсь новым пользователем.
socat можно использовать без использования сети, например, вы можете подключиться к контейнеру с именем container0, используя следующее:
socat EXEC:"docker attach container0",pty STDIO
Ctrl-c будет перехвачен socat и не будет передан в контейнер. Скорее всего, вы увидите коды управления терминалом в зависимости от того, что контейнер делает с tty.
Вы также можете передать команды контейнеру. Например, если в вашем контейнере была запущена оболочка на tty, и вы хотели, чтобы он запускал echo «Hello World», и вам все равно, или вы хотите вернуть вывод
echo "echo \"Hello World\"" | socat EXEC:"docker attach container0",pty STDIN
обратите внимание на использование STDIN вместо STDIO.
Может быть способ получше, но пока это лучшее, что я нашел.
socat
может запустить команду и перенаправить tty на «что-то».
Пример - создание сетевого сервера:
socat EXEC:"docker run -ti debian bash",pty \
TCP-LISTEN:7977,bind=127.0.0.1,fork
Это создает TCP-порт, к которому можно подключиться. Порт пересылает все назад и вперед на docker run
cli процесс:
→ nc 127.0.0.1 7977
root@045041cf8e60:/# whoami
whoami
root
root@045041cf8e60:/# ^C
Управляющие символы являются локальными для nc
, поэтому контейнер продолжает работать.