在 运行 进程中直接发送命令和间接发送命令(例如使用尾巴)

Send commands directly in running process and indirectly (e. g. with tail)

我目前正在为 运行 Minecraft Spigot 服务器构建一个 docker 项目。

为了实现这一点,我需要能够 运行 在 运行 宁 shell(使用 docker run -it d3strukt0r/spigot 时)和间接使用 docker exec <name> console <command> 命令.不幸的是,我不太喜欢 bash 语言。

目前,我可以间接发送命令,这在分离时非常好。我得到这个:

_console_input="/app/input.buffer"
# Clear console buffers
true >$_console_input

# Start the main application
echo "[....] Starting Minecraft server..."
tail -f $_console_input | tee /dev/console | $(command -v java) $JAVA_OPTIONS -jar /app/spigot.jar --nogui "$@"

而当 运行 执行控制台命令时,它所做的全部如下:

echo "$@" >>/app/input.buffer

代码可以找到here

有人知道如何添加直接输入命令的功能吗?

用例一:用户可以 运行 使用 docker run

附加
docker run -it --name spigot -p 25565:25565 -e EULA=true d3strukt0r/spigot:nightly

在这种情况下,用户肯定能够像他习惯的那样使用控制台(当运行宁java -jar spigot.jar)。 如果他打开了第二个控制台,他还可以发送命令:

docker exec spigot console "time set day"

用例二:用户可以 运行 使用 docker run -d

分离
docker run -d --name spigot -p 25565:25565 -e EULA=true d3strukt0r/spigot:nightly

在这种情况下,用户只能间接发送命令。

docker exec spigot console "time set day"

用例三和四:使用docker-compose(看用例"two",基本一样)

您可以制作一个脚本,其行为类似于迷你 shell,从标准输入读取并写入 /app/input.buffer。将它设置为容器的 CMD 以便它默认运行。将它放在与 Dockerfile 相同的目录中,并确保它是可执行的。

interactive_console

#!/bin/sh

while IFS= read -rp '$ ' command; do
    printf '%s\n' "$command"
done >> /app/input.buffer

Dockerfile

COPY interactive_console /usr/bin
CMD interactive_console