Shell Docker:在容器中运行的插口控制台上执行命令
总结一下我遇到的问题: 我想在容器中运行的minecraft控制台上执行一个命令,就像我在交互模式下附加到它时一样,但不需要附加到它Shell Docker:在容器中运行的插口控制台上执行命令,shell,docker,command-line,stdin,minecraft,Shell,Docker,Command Line,Stdin,Minecraft,总结一下我遇到的问题: 我想在容器中运行的minecraft控制台上执行一个命令,就像我在交互模式下附加到它时一样,但不需要附加到它 docker-attach-container\u-name 命令 从容器中分离 类似于运行docker exec,但它会将命令放入在容器内运行的程序的stdin中,就像docker attach中一样 我只是简单地搜索一个具有相同功能的oneliner。像这样 编辑: echo'say test'| docker attach 给出了错误: 输入设备不是TTY
docker-attach-container\u-name
命令
从容器中分离
类似于运行docker exec,但它会将命令放入在容器内运行的程序的stdin中,就像docker attach中一样
我只是简单地搜索一个具有相同功能的oneliner。像这样
编辑:
echo'say test'| docker attach
给出了错误:
输入设备不是TTY
编辑2:
在中删除容器链接上的-t标志后
echo'say test'| docker attach
该命令以日志显示的形式到达服务器,但在执行之后,我被困在一个空白输入中,因为该命令没有以某种方式停止
如果我现在执行双ctrl+c,容器将停止
编辑3:
我尝试在docker主机上执行这些命令,并在正在运行的spigot minecraft server中执行该命令显然,您可以使用命名管道来执行此操作,如下所示:
在Docker容器中
$mkfifo myfifo
$java-jar minecraft_server.jar noguimyfifo
如前所述,注意不要意外发送EOF字符。在标准Linux中无法执行此操作;我也不会在Docker尝试。网络(HTTP)接口是否更适合您的应用程序,这样您就可以发送it请求并返回响应,而无需尝试管理容器的stdin(也无需成为root用户才能与之交互)?谢谢您的回答!问题在于它不是一个自行开发的应用程序,而是一个minecraft服务器。我只想写到它的控制台。我编辑了这个问题,因此很明显这是一个minecraft服务器,而不是一个随机应用程序。这个答案很好,但不是我想要使用的答案,因为我需要重建映像,并且需要额外的逻辑来执行此操作。不幸的是,对您来说,写入服务器stdin的唯一方法是使用命名管道,这意味着您必须更改.jar的启动方式。不可能为一个进程“窃取”stdin,因为这会立即摧毁整个现代计算世界。是的,我明白:D唯一困扰我的事情是,当我设置-I和-t标志,手动附加并执行命令时,没有问题。但当我使用echo commd | container方法时,它说这不是tty设备。所以Docker使用stdin,但没有提供一种很好的写入方式。啊,等等,Docker容器是否已经用
nogui
启动了.jar,所以您只是想将Docker
的stdin连接到.jar stdin?是的!我想把它写在我正在运行的插口容器的stdin上。
# in the Docker container
$ mkfifo myfifo
$ java -jar minecraft_server.jar nogui < myfifo
# via your `docker exec`
$ echo 'say test' > myfifo