【发布时间】:2019-04-27 17:19:25
【问题描述】:
我正在尝试将我的 Ubuntu 16.04 服务器上的服务迁移到 docker 18.09.2(以便我可以利用 kubernetes)。我的问题是让一个 Jar 在 Docker 中工作,就像它在我的本地机器和服务器上一样。
也就是说,我试图在我的 Java Spring Boot 应用程序中运行一个 python 脚本,捕获 Python 的输出,然后显示文本。这在我的本地机器上运行良好,但是当我在 docker 基础映像上构建它并运行它时,什么也没有发生(即从 Buffered Reader 返回 null 值)
基础 Docker 映像是“openkbs/jre-mvn-py3”。 “HelloWorld.py”文件位于 SpringBoot 项目目录中。
从 openkbs 的文档 (https://hub.docker.com/r/openkbs/jre-mvn-py3/) 中,我在我的 processString 中尝试了几个不同的命令,但没有任何效果。类似的命令:
docker run -it --rm openkbs/jdk-mvn-py3 python3 -c 'print("Hello World")'
docker run -i --rm openkbs/jdk-mvn-py3 python3 以下是我的相关配置和代码行: Dockerfile: Java: Python:FROM openkbs/jdk-mvn-py3
ADD target/dockerMaster.jar dockerMaster.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "dockerMaster.jar"]
@RequestMapping("/pytest")
public String pytest() {
Runtime rt = Runtime.getRuntime();
String processString = "python3 HelloWorld.py";
System.out.println(processString);
try {
Process extractProcess = rt.exec(processString);
BufferedReader input = new BufferedReader(new InputStreamReader(extractProcess.getInputStream()));
String pyString = input.readLine();
return new String("<PYSTUFF>SUCCESS " + pyString + "</PYSTUFF>");
} catch (IOException e) {
e.printStackTrace();
return new String("<FAIL>PYTHON DID NOT RUN</FAIL>");
}
}
print("Hello World")
【问题讨论】:
-
你想对在那里传递 Python 代码的运行行做什么?您是否希望以某种方式将 Python 代码放置在 Spring 应用程序可以找到并运行它的位置?我在这里看不到任何暗示会发生这种情况。您的容器正在运行您的 Spring 应用程序,然后该应用程序可能能够响应路径
/pytest处的 Web 请求。我看到 Java 代码正在尝试运行名为HelloWorld.py的 Python 脚本。您希望该文件如何到达您的 Spring 应用程序正在寻找它的位置?我在这里看不到任何东西会开始这样做。 -
另外,您似乎正在运行
openkbs/jdk-mvn-py3容器镜像,而不是您自己使用 Dockerfile 创建的镜像。此映像只是您的 Dockerfile 描述的您自己的容器的起点。你需要从你的 Dockerfile 构建一个镜像,在你这样做的时候给它一个名字,然后使用这个名字和docker run。因此,您正在运行的容器中甚至都不存在您的代码。 -
...我刚刚意识到...你说你已经尝试过类似
docker run -i --rm openkbs/jdk-mvn-py3 python3 < HelloWorld.py“在你的 processString 中”的东西。该字符串在您的 Java 中,看起来您正在将其放入容器中。那么您是否试图从另一个容器中运行一个容器?请更好地解释您想要做什么,尤其是那两条docker run行与任何事情有什么关系。 -
这个 Spring Boot 项目是一个 RestAPI,它获取 pdf 文件,解析它们,然后根据解析算法返回一个字符串。为此,最终目标是运行 pdfminer 的 dumppdf.py(我已经可以在本地机器和服务器上运行)。现在,作为过渡到 Docker 的构建块,我只是想确保我的容器可以运行一个简单的 python 文件并给我输出。代码在我的本地机器上运行,在服务器上运行相同的代码,python文件的位置被更明确地指定(如你所建议的那样)。
-
对于 docker,我正在使用 Dockerfile 在项目文件夹中运行“docker build ...”,从 Spring Boot 项目构建一个新映像。然后我使用“docker run ...”运行图像。这是我无法正确运行的图像。为了清楚起见,我不想在一个容器中运行一个容器,只是为了运行一个容器,它是一个 Sprong Boot 应用程序,它有时会使用 python 代码。
标签: java python docker spring-boot-maven-plugin