进程(从容器中的 Java 开始)在哪里执行?

Where does a process (started from Java in a container) gets executed?

我有一个 java 应用程序。

我需要从这个应用程序启动一个脚本。

如果我直接在终端执行命令启动脚本,我会得到想要的结果,比如:

root@host [ ~ ]# docker exec -it mycontainer bash
root [ /mycontainer ]# nsenter -t 1 -m -u -n -i sh /gg/my.sh -c telegraf -a status
status      #some custom output from the script
telegraf
**************
207

如果我从 Java 应用程序开始完全相同的事情,我不会得到正确的结果。 (结果就像我在容器内执行脚本一样。) Java代码:

 String command = "nsenter -t 1 -m -u -n -i sh /gg/my.sh -a " + action + " -c " + name;
 Process ps = Runtime.getRuntime().exec(command);
...
log.info(psOutput)

日志:

not found
**************
not implemented.

完整上下文:

是的,我知道.. 进程隔离和 docker 容器等,有时您只需要从容器触发主机上的一组命令的执行。 我在 .

之后触发脚本从容器到主机的执行

有人可以向我解释为什么吗?当我从 Java 应用程序执行我的命令时到底发生了什么?为什么感觉从 Java 应用程序启动的进程被包裹在另一个进程中,也许吧?

进程已在容器上执行。

因为容器尚未使用正确的参数启动以允许在主机上执行。

为了在主机上执行脚本,必须提升容器的权限,触发脚本,并为应该执行脚本的进程添加 PID - --privileged --pid=host

类似于:

docker container create --name=my-app --restart=always \
 --privileged --pid=host \ # <---here is the important part
my-app-image:01