Отправлять команды прямо в запущенном процессе и косвенно (например, с хвостом) - PullRequest
0 голосов
/ 27 мая 2020

В настоящее время я создаю проект docker для запуска сервера Minecraft Spigot.

Для этого мне нужно иметь возможность запускать команды в запущенной оболочке (при использовании 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

Код можно найти здесь

Кто-нибудь знает, как теперь добавить функциональность для прямого ввода команд?

СЛУЧАЙ ИСПОЛЬЗОВАНИЯ ПЕРВЫЙ: пользователь может работать с подключением, используя 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 (см. Вариант использования «два», в принципе то же самое)

1 Ответ

1 голос
/ 27 мая 2020

Вы можете создать сценарий, который действует как мини-оболочка, читая из стандартного ввода и записывая в /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
...