我正在Ruby on Rails中编写一个Web应用程序,用户可以在Web编辑器中编写python代码并在服务器上的docker环境中执行它。我编写了一个简单的python代码来创建一个docker容器:
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创建了一个docker容器,并在其中执行一个简单的python脚本。如果用户按下Web编辑器中的执行按钮,Ruby on Rails将使用以下命令执行此脚本:system("python","script.py","<TOKEN>")
到目前为止,这一切都很好。
但是,在docker容器中执行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')
看起来很简单,但是在这个请求期间,rails webserver上的整个ruby都会挂起。奇怪的是,如果我在重新启动服务器后首先从控制台手动执行此脚本,一切正常。
如果这样,我从Rails控制台获得的唯一内容是:
Started GET "/allAssets/123" for 10.0.2.15 at 2017-08-02 10:24:59 +0200
当我退出Web服务器重启时,Ruby on Rails会显示以下日志:
然后什么都没有。有谁知道可能是什么问题?
答案 0 :(得分:0)
我猜你应该在后台运行容器。
res = client.containers.run('openql','python3 /home/pythonwrapper.py '+token, detach=True)
这将确保您的服务器在等待容器完成并完成正在执行的命令之前不会卡住