web-dev-qa-db-fra.com

Python n'imprime rien lors de l'exécution détachée dans le menu fixe

J'ai une application Python (2.7) qui est lancée dans mon fichier de docker:

CMD ["python","main.py"]

main.py affiche certaines chaînes au démarrage et passe ensuite en boucle:

print "App started"
while True:
    time.sleep(1)

Tant que je lance le conteneur avec l'option -it, tout fonctionne comme prévu:

$ docker run --name=myapp -it myappimage
> App started

Et je peux voir la même sortie via les journaux plus tard:

$ docker logs myapp
> App started

Si j'essaie d'exécuter le même conteneur avec l'indicateur -d, le conteneur semble démarrer normalement, mais je ne vois aucune sortie:

$ docker run --name=myapp -d myappimage
> b82db1120fee5f92c80000f30f6bdc84e068bafa32738ab7adb47e641b19b4d1
$ docker logs myapp
$ (empty)

Mais le conteneur semble toujours courir;

$ docker ps
Container Status ...
myapp     up 4 minutes ... 

Joindre n'affiche rien non plus:

$ docker attach --sig-proxy=false myapp
(working, no output)

Des idées qui ne vont pas? Est-ce que "print" se comporte différemment lorsqu'il est exécuté en arrière-plan?

Version Docker:

Client version: 1.5.0
Client API version: 1.17
Go version (client): go1.4.2
Git commit (client): a8a31ef
OS/Arch (client): linux/arm
Server version: 1.5.0
Server API version: 1.17
Go version (server): go1.4.2
Git commit (server): a8a31ef
99
jpdus

Enfin, j'ai trouvé une solution pour voir Python le résultat lors de l'exécution démonisée dans Docker, grâce à @ahmetalpbalkan sur GitHub . Répondre ici moi-même pour référence ultérieure:

Utiliser une sortie sans tampon avec

CMD ["python","-u","main.py"]

au lieu de

CMD ["python","main.py"]

résout le problème; vous pouvez voir la sortie (à la fois stderr et stdout) via

docker logs myapp

maintenant!

169
jpdus

Dans mon cas, exécuter Python avec -u n'a rien changé. Qu'est-ce que l'astuce, cependant, était de définir PYTHONUNBUFFERED=0 comme variable d’environnement:

docker run --name=myapp -e PYTHONUNBUFFERED=0 -d myappimage
53
Victor

Pour moi, c'est une fonctionnalité, pas un bug. Sans pseudo-téléscripteur, il n'y a rien à faire. Une solution simple consiste donc à allouer un pseudo-TTY à votre conteneur en cours d'exécution avec:

$ docker run -t ...
14
Peter Senna

Comme solution rapide, essayez ceci:

from __future__ import print_function
# some code
print("App started", file=sys.stderr)

Cela fonctionne pour moi lorsque je rencontre les mêmes problèmes. Mais, pour être honnête, je ne sais pas pourquoi cette erreur se produit.

0
Vitaly Isaev