2017-08-02 40 views
0

我正在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的显示以下日志:

Screenshot console

而且那么没有有谁知道可能是什么问题?

回答

0

你应该在后台运行容器我猜。

res = client.containers.run('openql','python3 /home/pythonwrapper.py '+token, detach=True) 

这将确保你的服务器不会被卡,直到它等待容器来完成,并完成它正在执行

+0

大的命令,没想到这一点,有时一个解决方案可以使简单。谢谢 – Stan

+0

很高兴能有所帮助。你能把它标记为接受的答案吗? –