我有一个Java/Kotlin应用程序,它在用户每次发出请求时都会运行Python脚本。
它在我的笔记本电脑和任何其他VPS上都运行良好。但我不能让它在Heroku上工作。它不工作,并且不打印任何内容。
相关代码如下:
val command = "python3 $s/assets/script.py $params"
println("Command: $command")
val process = Runtime.getRuntime().exec(command)
process.waitFor()
val reader = BufferedReader(InputStreamReader(process.inputStream))
val message = reader.lines().collect(Collectors.joining("\n"))
println(message)
为什么这在Heroku上会失败?
发布于 2018-09-16 22:04:16
Heroku基于buildpacks构建应用程序。每个构建包都知道如何构建特定类型的项目,例如,一个可能知道如何安装Maven依赖项和编译Kotlin源代码,而另一个可能知道如何安装Ruby gem。
在简单的情况下,开发人员不需要太担心这一点。当没有显式请求构建包时,Heroku tries to infer which buildpack it should use。基本上,它以给定的顺序迭代官方支持的构建包,并使用每个构建包的detection script来查看项目是否与该构建包匹配。
一旦找到匹配的构建包,它就会停止查找。在简单的情况下,这通常就足够了。但是每个构建包都被设计为生成一个相当精简的映像;您可能希望在常规Linux机器上存在的工具并不一定存在。特别是,Java/Kotlin构建包不会为您提供python
二进制文件。
好消息是,只需进行一点配置,就可以使用multiple buildpacks。
首先,设置您的主构建包:heroku buildpacks:set heroku/java
heroku buildpacks:add --index 1 heroku/python
heroku buildpacks
确保您的构建包以正确的顺序显示(首先是,然后是列表中的最后一个构建包将用于确定应用程序的process types。从早期构建包中定义的任何进程类型都将被忽略。
Python
requirements.txt
文件,以防止构建包无法运行。或者,您可以添加任何Python依赖项。如果您确实有Python依赖项,请考虑使用Pipfile
和Pipfile.lock
而不是requirements.txt
。这将导致使用pipenv
而非pip
.构建您的应用程序
https://stackoverflow.com/questions/52347984
复制相似问题