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
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!
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
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 ...
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.