进程(从容器中的 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.
完整上下文:
- Java 应用在 docker 容器中
- 我需要运行主机上的脚本
是的,我知道.. 进程隔离和 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
我有一个 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.
完整上下文:
- Java 应用在 docker 容器中
- 我需要运行主机上的脚本
是的,我知道.. 进程隔离和 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