何在Docker容器中写入日志

时间:2017-12-20 16:42:00

标签: docker logging

我制作了最简单的C应用程序,只打印一条消息:

#include <stdio.h>
#include <unistd.h>
int main(){
    int i = 0;
    while(1) {
        sleep(1);
        printf("sleeping ... %d\n", i++);
    }
}

然后,为它做了一个最简单的Dockerfile:

FROM fedora

USER root
WORKDIR /root

ADD sleep-play .

CMD ["/root/sleep-play"]

然后,尽可能简单地运行该容器:

sudo docker build -t sleeping .
sudo docker run --name sleeping -d sleeping

最后我希望看到 stdout 输出,但没有任何反应

sudo docker logs -f sleeping
## nothing shown!

来自here:

  

...默认情况下,docker日志显示命令的STDOUT和STDERR。

我做错了什么?

2 个答案:

答案 0 :(得分:1)

我不太确定,我最好的猜测是printf是缓冲的,也许缓冲区不会在这里自动刷新。

尝试手动冲洗它:

fflush(stdout)

另请参阅用于刷新手动printf语句的此相关Stackoverflow条目: write() to stdout and printf output not interleaved?

答案 1 :(得分:1)

我复制了它并发现睡眠命令是你的问题。目前我不知道确切的原因,但没有睡眠命令它运行。

也许这篇文章可以帮助您:https://github.com/moby/moby/issues/2838#issuecomment-194054757