如何从docker容器中的java/spring启动项目运行python脚本(并接收输出)?

如何从docker容器中的java/spring启动项目运行python脚本(并接收输出)?,java,python,docker,spring-boot-maven-plugin,Java,Python,Docker,Spring Boot Maven Plugin,我正在尝试将Ubuntu 16.04服务器上的服务迁移到docker 18.09.2(这样我就可以利用kubernetes)。我的问题是让一个Jar在Docker中工作,就像它在本地机器和服务器中工作一样 也就是说,我试图在JavaSpring启动应用程序中运行python脚本,捕获python的输出,然后显示文本。这在我的本地机器上运行得很好,但当我在docker base映像上构建它并运行它时,什么都不会发生(即,从缓冲读取器返回null值) 基本docker映像是“openkbs/jre-

我正在尝试将Ubuntu 16.04服务器上的服务迁移到docker 18.09.2(这样我就可以利用kubernetes)。我的问题是让一个Jar在Docker中工作,就像它在本地机器和服务器中工作一样

也就是说,我试图在JavaSpring启动应用程序中运行python脚本,捕获python的输出,然后显示文本。这在我的本地机器上运行得很好,但当我在docker base映像上构建它并运行它时,什么都不会发生(即,从缓冲读取器返回null值)

基本docker映像是“openkbs/jre-mvn-py3”。“HelloWorld.py”文件位于SpringBoot项目目录中

根据openkbs的文档(),我在processString中尝试了一些不同的命令,但没有任何效果。命令如下:

docker run-it--rm openkbs/jdk-mvn-py3 python3-c'打印(“Hello World”)'

docker运行-i--rm openkbs/jdk-mvn-py3 python3 以下是我的相关配置和代码行:

Dockerfile:

FROM openkbs/jdk-mvn-py3
ADD target/dockerMaster.jar dockerMaster.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "dockerMaster.jar"]
爪哇:

@RequestMapping(“/pytest”)
公共字符串pytest(){
Runtime rt=Runtime.getRuntime();
String processString=“python3 HelloWorld.py”;
System.out.println(processString);
试一试{
Process extractProcess=rt.exec(processString);
BufferedReader输入=新的BufferedReader(新的InputStreamReader(extractProcess.getInputStream());
String pyString=input.readLine();
返回新字符串(“SUCCESS”+pyString+”);
}捕获(IOE异常){
e、 printStackTrace();
返回新字符串(“PYTHON未运行”);
} 
}
Python:

print(“你好世界”)

您没有将HelloWorld.py文件放入容器中,这就是它不起作用的原因。您需要做的是将HelloWorld.py添加到容器中,并确保容器中安装了python

FROM openkbs/jdk-mvn-py3
ADD target/dockerMaster.jar dockerMaster.jar
ADD target/HelloWorld.py HelloWorld.py
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "dockerMaster.jar"]

在那里传递Python代码的运行行中,您想做什么?您是否希望以某种方式将Python代码放在Spring应用程序可以找到并运行它的地方?我看这里没有任何迹象表明会发生这种情况。您的容器正在运行Spring应用程序,然后该应用程序大概能够响应路径
/pytest
处的web请求。我看到Java代码正在尝试运行名为
HelloWorld.py
的Python脚本。您希望该文件如何到达您的Spring应用程序正在查找的位置?我在这里看不到任何开始这样做的东西。而且,您似乎正在运行
openkbs/jdk-mvn-py3
容器映像,而不是您自己用Dockerfile创建的映像。此图像只是Dockerfile描述的您自己的容器的起点。您需要从docker文件中构建一个映像,这样做时给它一个名称,然后将该名称与
docker run
一起使用。因此,您的代码甚至都不存在于您正在运行的容器中……我刚刚意识到……您说您尝试过类似于
docker run-I--rm openkbs/jdk-mvn-py3 python3
“在您的processString中”这样的方法。该字符串位于Java中,看起来您正在将其放入容器中。那么,您是否试图从一个容器内部运行另一个容器?请更好地解释一下你想做什么,特别是这两条docker run行与任何事情都有什么关系。这个Spring Boot项目是一个RestAPI,它接受pdf文件,解析它们,然后根据解析算法返回字符串。为此,最终目标是运行pdfminer的dumppdf.py(我已经可以在本地机器和服务器上运行了)。现在,作为向Docker过渡的构建块,我只是想确保我的容器可以运行一个简单的python文件并提供输出。代码原样运行在我的本地计算机上,在服务器上,同样的代码运行时,python文件的位置被更明确地指定(如您所建议的)。至于docker,我正在通过在项目文件夹中运行带有docker文件的“docker build…”从Spring Boot项目构建一个新映像。然后我用“docker run…”运行图像。这是我无法正确运行的图像。为清楚起见,我不想在容器中运行容器,只想运行一个容器,它是一个Sprong引导应用程序,有时会访问python代码。