According to another answer on ServerFault, you can use socat to pipe input to a docker container like this:
echo 'hi' | socat EXEC:"docker attach container0",pty STDIN
Note that the echo command includes a newline at the end of the output, so the line above actually sends hi\n. Use echo -n if you don't want a newline.
Let's see how this looks like with the example script from David's answer:
# Create a new empty directory mkdir x # Run a container, in the background, that copies its stdin # to a file in that directory docker run -itd --rm -v $PWD/x:/x --name cattainer busybox sh -c 'cat >/x/y' # Send some strings in echo 'hi' | socat EXEC:"docker attach cattainer",pty STDIN echo 'still there?' | socat EXEC:"docker attach cattainer",pty STDIN # Stop container (cleans up itself because of --rm) docker stop cattainer # See what we got out cat x/y # should output: # hi # still there?
You could also wrap it in a shell function:
docker_send() { container="$1"; shift echo "$@" | socat EXEC:"docker attach $container",pty STDIN } docker_send cattainer "Hello cat!" docker_send cattainer -n "No newline here:" # flag -n is passed to echo
Trivia: I'm actually using this approach to control a Terraria server running in a docker container, because TerrariaServer.exe only accepts server commands (like save or exit) on stdin.
socat. Please look at the following question on serverfault for details: serverfault.com/questions/885765