在运行调用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 ######
也是如此,直到容器停止之后,什么也没有出现,即使是预期的情况。
这对于调试非常麻烦。 为什么会发生这种情况?我可以更改一个设置以确保日志实时更新吗?
答案 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。