我正在Ruby on Rails中编写Web应用程序,用户可以在Web编辑器中编写python代码并在服务器上的docker环境中执行它。我已经写了创建一个码头工人的容器一个简单的Python代码:Ruby on Rails在来自Python脚本的HTTP请求期间挂起
import docker
import sys
if __name__ == "__main__":
if(len(sys.argv) == 2):
token = sys.argv[1]
client = docker.from_env()
res = client.containers.run('openql','python3 /home/pythonwrapper.py '+token)
else:
print("Requires one parameter")
正如你可以看到它使用创建的图像openql泊坞窗容器内,并执行一个简单的Python脚本。如果用户在Web编辑器中按下执行按钮,Ruby on Rails将通过使用以下命令来执行此脚本:system("python","script.py","<TOKEN>")
到目前为止,这一切都很好。
但是,在码头集装箱内执行pythonwrapper.py
时出现问题。我使用python的请求库来请求用户编写的文件在docker容器内执行它们。代码如下所示:
# Request all the available assets, it does not download the content of the files.
# Downloading the content of the files is done in a later request
url = rails_url+"allAssets/"+token
res = requests.get(url)
#Convert bytes into string
content = str(res.content, 'utf8')
看起来很简单,但整个ruby on rails web服务器在此请求期间挂起。而奇怪的是,如果我在重新启动服务器之后首先从控制台手动执行此脚本,那么它一切正常。
我从Rails的控制台中看到的唯一的事情,如果这样的:
Started GET "/allAssets/123" for 10.0.2.15 at 2017-08-02 10:24:59 +0200
当我退出的网络服务器重启,Ruby on Rails的显示以下日志:
而且那么没有有谁知道可能是什么问题?
大的命令,没想到这一点,有时一个解决方案可以使简单。谢谢 – Stan
很高兴能有所帮助。你能把它标记为接受的答案吗? –