J'ai une application Python (2.7) qui démarre dans mon dockerfile:
CMD ["python","main.py"]
main.py imprime des chaînes au démarrage et entre dans une boucle par la suite:
print "App started"
while True:
time.sleep(1)
Tant que je démarre le conteneur avec l'indicateur -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 fonctionner;
$ docker ps
Container Status ...
myapp up 4 minutes ...
Attach n'affiche rien non plus:
$ docker attach --sig-proxy=false myapp
(working, no output)
Des idées qui ne vont pas? «Print» se comporte-t-il 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
la source
ENV PYTHONUNBUFFERED=0
au cas où l'-u
indicateur ne fonctionnerait pas.-u
ici: stackoverflow.com/questions/107705/disable-output-bufferingDans mon cas, exécuter Python avec
-u
n'a rien changé. L'astuce, cependant, était de définirPYTHONUNBUFFERED=0
comme variable d'environnement:la source
-e PYTHONUNBUFFERED=0
aide.-u
. Votre solution l'a corrigé pour moi sur Docker pour Mac avec DjangoPour moi, c'est une fonctionnalité, pas un bug. Sans pseudo-TTY, il n'y a rien sur lequel sortir. Une solution simple consiste donc à allouer un pseudo-TTY à votre conteneur en cours d'exécution avec:
la source
tty: true
dans compose landConsultez cet article qui explique en détail la raison du comportement:
Et GNU libc (glibc) utilise les règles suivantes pour la mise en mémoire tampon:
Donc, si vous l'utilisez
-t
, à partir du document docker , il allouera un pseudo-tty, puisstdout
devientline-buffered
, ainsidocker run --name=myapp -it myappimage
pourrait voir la sortie sur une ligne.Et, si l' utilisation juste
-d
, pas TTY a été attribué, alors,stdout
estfully-buffered
, une ligneApp started
sûrement pas en mesure de vider le tampon.Ensuite, l' utilisation
-dt
demake stdout line buffered
ou ajouter-u
en pythonflush the buffer
est le moyen de le réparer.la source
Si vous souhaitez ajouter votre sortie d'impression à votre sortie Flask lors de l'exécution
docker-compose up
, ajoutez ce qui suit à votre fichier de composition de docker.https://docs.docker.com/compose/environment-variables/
la source
Vous pouvez voir les journaux sur l'image détachée si vous passez
print
àlogging
.main.py:
Dockerfile:
la source
Puisque je n'ai pas encore vu cette réponse:
Vous pouvez également vider stdout après avoir imprimé dessus:
la source
Essayez d'ajouter ces deux variables d'environnement à votre solution
PYTHONUNBUFFERED=1
etPYTHONIOENCODING=UTF-8
la source
En guise de solution rapide, essayez ceci:
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.
la source
J'ai dû utiliser
PYTHONUNBUFFERED=1
dans mon fichier docker-compose.yml pour voir la sortie de django runserver.la source
Habituellement, nous le redirigeons vers un fichier spécifique (en montant un volume depuis l'hôte et en l'écrivant dans ce fichier).
Ajouter un tty en utilisant -t est également très bien. Vous devez le récupérer dans les journaux du docker.
En utilisant de grandes sorties de journal, je n'ai eu aucun problème avec le stockage du tampon sans le mettre dans le journal des dockers.
la source
Si vous n'utilisez pas
docker-compose
et simplement normal à ladocker
place, vous pouvez ajouter ceci à votreDockerfile
qui héberge une application flaskla source