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=0
en caso de que el-u
indicador no funcione.-u
aquí: stackoverflow.com/questions/107705/disable-output-bufferingEn mi caso, ejecutar Python con
-u
no cambió nada. Sin embargo, el truco fue establecerPYTHONUNBUFFERED=0
como variable de entorno:fuente
-e PYTHONUNBUFFERED=0
ayuda.-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: true
en 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 sestdout
convierteline-buffered
, por lo quedocker run --name=myapp -it myappimage
podría ver la salida de una línea.Y, si solo se usa
-d
, no se asignó tty, entonces,stdout
es decirfully-buffered
, una líneaApp started
seguramente no puede vaciar el búfer.Entonces, el uso
-dt
demake stdout line buffered
o complemento-u
en python aflush the buffer
es 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
print
alogging
.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=1
yPYTHONIOENCODING=UTF-8
fuente
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=1
en 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-compose
y simplemente es normaldocker
, puede agregar esto a suDockerfile
host de una aplicación de matrazfuente