0

我正在用 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>")到目前为止一切顺利,一切正常。

pythonwrapper.py但是,在 docker 容器内部执行时存在问题。我正在使用 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 webserver 挂起。奇怪的是,如果我在重新启动服务器后首先从控制台手动执行此脚本,那么一切正常。

我从 Rails 控制台得到的唯一信息是:

Started GET "/allAssets/123" for 10.0.2.15 at 2017-08-02 10:24:59 +0200

当我退出网络服务器以重新启动时,Ruby on Rails 显示以下日志:

截图控制台

然后什么都没有。有谁知道可能是什么问题?

4

1 回答 1

0

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

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

这将确保您的服务器在等待容器完成并完成它正在执行的命令之前不会卡住

于 2017-08-02T10:07:19.503 回答