我正在用 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 显示以下日志:
然后什么都没有。有谁知道可能是什么问题?