Назад | Перейти на главную страницу

Как отправить текст на стандартный ввод контейнера докеров?

У меня есть докер-контейнер, который запускает 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, поэтому контейнер продолжает работать.