【问题标题】:Docker: Exec a command on spigot console runnning in a containerDocker:在容器中运行的 spigot 控制台上执行命令
【发布时间】:2020-08-12 09:00:53
【问题描述】:

总结一下我遇到的问题: 我想在容器中运行的 minecraft 控制台上执行命令,就像我以交互模式附加到它但不需要附加到它时一样。

docker attach container_name

command

detach_from_contaienr

就像运行 docker exec 一样,但它将命令放入容器内运行的程序的标准输入中,就像在 docker attach 中一样。

我只是搜索一个具有相同功能的 oneliner。就像在这个question

编辑: echo 'say test' | docker attach <container id>

给出错误:

the input device is not a TTY

编辑2: 在 this post 中删除容器链接上的 -t 标志后

echo 'say test' | docker attach <container id>

命令在日志显示时到达服务器,但在执行后我卡在空白输入中,因为命令不会以某种方式停止

如果我现在执行双重 ctrl+c 容器将停止...

编辑3: 我尝试在 docker 主机上执行这些命令,并在正在运行的 spigot minecraft 服务器中执行命令

【问题讨论】:

  • 在标准 Linux 中你不能这样做;我也不会在 Docker 中尝试它。网络 (HTTP) 接口是否更适合您的应用程序,这样您就可以向它发送请求并获取响应,而无需尝试管理容器的标准输入(并且无需以 root 身份与之交互)?
  • 感谢您的回答!问题是它不是一个自行开发的应用程序,而是一个我的世界服务器。我只想写到它的控制台。我编辑了这个问题,所以很明显它是一个我的世界服务器而不是一个随机应用程序。

标签: shell docker command-line stdin minecraft


【解决方案1】:

显然,您可以使用命名管道来执行此操作,如下所示:https://stackoverflow.com/a/26765590/2926055

# in the Docker container
$ mkfifo myfifo
$ java -jar minecraft_server.jar nogui < myfifo

# via your `docker exec`
$ echo 'say test' > myfifo

如上所述,请注意不要意外发送 EOF 字符。

【讨论】:

  • 这个答案非常好,但不是我想要使用的答案,因为我需要重建图像并且需要额外的逻辑来执行此操作。
  • 不幸的是,写入服务器标准输入的唯一方法是使用命名管道,这意味着您必须更改 .jar 的启动方式。不可能为进程“窃取”标准输入,因为这会立即摧毁整个现代计算世界。
  • 是的,我明白 :D 唯一困扰我的是,当我设置 -i 和 -t 标志并手动附加并执行命令时,这没问题。但是当我使用 echo commd |它说的容器方法不是 tty 设备。所以 Docker 使用标准输入,但没有提供一种很好的写入方式。
  • 啊等一下,Docker 容器是否已经使用nogui 启动了.jar,所以您只是想将docker 的标准输入连接到.jar 标准输入?
  • 是的!我想把它写到我正在运行的 spigot 容器的标准输入中。
猜你喜欢
  • 2019-04-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多