在容器停止之前,“ Docker日志”错误地显示为空

时间:2019-11-04 21:20:10

标签: python docker

在运行调用Python进程的Docker容器时,运行 rday = function( start_day = as.Date("2019-01-01"), end_day = as.Date("2019-01-31"), weekend_weight = 2, ... ) { if (! "Date" %in% class(start_day)) start_day = as.Date(start_day) if (! "Date" %in% class(end_day)) end_day = as.Date(end_day) dates = seq(start_day, end_day, by = "1 day") weights = rep(1, length(dates)) weights[weekdays(dates) %in% c("Saturday", "Sunday")] = 1 sample(dates, ..., prob = weights) } rday(size = 15) # [1] "2019-01-24" "2019-01-07" "2019-01-21" "2019-01-15" "2019-01-27" "2019-01-04" "2019-01-30" "2019-01-12" # [9] "2019-01-11" "2019-01-08" "2019-01-20" "2019-01-01" "2019-01-03" "2019-01-19" "2019-01-29" 不会返回任何内容,尽管容器内部发生了事件会发给docker logs #####。直到我运行stdout为止,日志中才会出现该注释,在这种情况下,将返回预期的输出。 docker stop ######也是如此,直到容器停止之后,什么也没有出现,即使是预期的情况。

这对于调试非常麻烦。 为什么会发生这种情况?我可以更改一个设置以确保日志实时更新吗?

1 个答案:

答案 0 :(得分:4)

这可能是因为stdout和stderr是缓冲流。

  

交互式时,stdout和stderr流是行缓冲的。否则,它们将像常规文本文件一样被块缓冲。您可以使用-u命令行选项覆盖此值。

尝试添加-u标志。

CMD [ "python", "-u", "./your_script.py" ]

或者,正如David Maze指出的那样,您可以设置PYTHONUNBUFFERED environment variable并获得相同的结果。

ENV PYTHONUNBUFFERED=1

您还可以在每次调用print()时刷新标准输出。

sys.stdout.flush()

或者,请参见logging module