Tengo una aplicación Python (2.7) que se inicia en mi dockerfile:
CMD ["python","main.py"]
main.py imprime algunas cadenas cuando se inicia y luego entra en un bucle:
print "App started"
while True:
time.sleep(1)
Mientras inicio el contenedor con el indicador -it, todo funciona como se esperaba:
$ docker run --name=myapp -it myappimage
> App started
Y puedo ver la misma salida a través de registros más tarde:
$ docker logs myapp
> App started
Si intento ejecutar el mismo contenedor con el indicador -d, el contenedor parece comenzar normalmente, pero no puedo ver ningún resultado:
$ docker run --name=myapp -d myappimage
> b82db1120fee5f92c80000f30f6bdc84e068bafa32738ab7adb47e641b19b4d1
$ docker logs myapp
$ (empty)
Pero el contenedor todavía parece funcionar;
$ docker ps
Container Status ...
myapp up 4 minutes ...
Adjuntar tampoco muestra nada:
$ docker attach --sig-proxy=false myapp
(working, no output)
¿Alguna idea de qué va mal? ¿"Print" se comporta de manera diferente cuando se ejecuta en segundo plano?
Versión de 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
fuente

ENV PYTHONUNBUFFERED=0en caso de que el-uindicador no funcione.-uaquí: stackoverflow.com/questions/107705/disable-output-bufferingEn mi caso, ejecutar Python con
-uno cambió nada. Sin embargo, el truco fue establecerPYTHONUNBUFFERED=0como variable de entorno:fuente
-e PYTHONUNBUFFERED=0ayuda.-u. Su solución me lo arregló en Docker para Mac con DjangoPara mí es una característica, no un error. Sin un pseudo-TTY no hay nada a lo que stdout. Entonces, una solución simple es asignar un pseudo-TTY para su contenedor en ejecución con:
fuente
tty: trueen tierra compuestaVea este artículo que explica la razón detallada del comportamiento:
Y GNU libc (glibc) usa las siguientes reglas para el almacenamiento en búfer:
Entonces, si se usa
-t, desde el documento de docker , asignará un pseudo-tty, luego sestdoutconvierteline-buffered, por lo quedocker run --name=myapp -it myappimagepodría ver la salida de una línea.Y, si solo se usa
-d, no se asignó tty, entonces,stdoutes decirfully-buffered, una líneaApp startedseguramente no puede vaciar el búfer.Entonces, el uso
-dtdemake stdout line bufferedo complemento-uen python aflush the bufferes la forma de solucionarlo.fuente
Si desea agregar su salida de impresión a su salida de Flask cuando se está ejecutando
docker-compose up, agregue lo siguiente a su archivo de composición docker.https://docs.docker.com/compose/environment-variables/
fuente
Puede ver registros en la imagen separada si cambia
printalogging.main.py:
Dockerfile:
fuente
Como todavía no he visto esta respuesta:
También puede eliminar stdout después de imprimir en él:
fuente
Intente agregar estas dos variables de entorno a su solución
PYTHONUNBUFFERED=1yPYTHONIOENCODING=UTF-8fuente
Como solución rápida, intente esto:
Esto funciona para mí cuando me encuentro con los mismos problemas. Pero, para ser honesto, no sé por qué ocurre este error.
fuente
Tuve que usar
PYTHONUNBUFFERED=1en mi archivo docker-compose.yml para ver la salida de django runserver.fuente
Por lo general, lo redirigimos a un archivo específico (montando un volumen desde el host y escribiéndolo en ese archivo).
Agregar un tty usando -t también está bien. Debe recogerlo en los registros de la ventana acoplable.
Utilizando salidas de registro grandes, no tuve ningún problema con el almacenamiento del búfer sin ponerlo en el registro de los acopladores.
fuente
Si no está usando
docker-composey simplemente es normaldocker, puede agregar esto a suDockerfilehost de una aplicación de matrazfuente