2017-08-02 3 views
0

J'écris une application web dans Ruby on Rails où les utilisateurs peuvent écrire du code python dans un éditeur web et l'exécuter dans un environnement docker sur le serveur. J'ai écrit un simple code python qui crée un conteneur docker:Ruby on Rails se bloque pendant la requête HTTP du script Python

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") 

Comme vous pouvez le voir crée un conteneur docker en utilisant l'image openql et exécuter un script python simple à l'intérieur. Si un utilisateur appuie sur le bouton Exécuter dans l'éditeur Web, Ruby on Rails exécute ce script en utilisant la commande suivante: system("python","script.py","<TOKEN>") Jusqu'ici, tout va bien.

Toutefois, il existe un problème lors de l'exécution du pythonwrapper.py dans le conteneur docker. J'utilise la bibliothèque de requêtes de Python pour demander aux fichiers écrits par l'utilisateur de les exécuter dans le conteneur docker. Le code ressemble à ceci:

# 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') 

semble assez simple, mais tout le rubis sur webserver rails se bloque pendant cette demande. Et la chose étrange est que tout fonctionne bien si j'exécute d'abord ce script manuellement à partir de la console après le redémarrage du serveur.

La seule chose que je reçois de la console Rails si ceci:

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

Quand je quitte le serveur Web pour un redémarrage, Ruby on Rails montre les journaux suivants:

Screenshot console

Et alors rien. Est-ce que quelqu'un sait quel pourrait être le problème?

Répondre

0

Vous devez exécuter le conteneur en arrière-plan, je suppose.

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

Cela fera en sorte que votre serveur est pas coincé jusqu'à ce qu'il attend le récipient pour compléter et terminer la commande qu'il exécute

+0

Grand, ne pense pas que cela, parfois une solution peut être si simple. Merci – Stan

+0

Content d'être utile. Pouvez-vous le marquer comme la réponse acceptée? –