将在docker容器中创build的日志文件redirect到stdout / stderr

我有以下的Dockerfile:

FROM ubuntu:16.04 RUN apt-get update VOLUME ["/LOGS"] COPY ./testServer . ENTRYPOINT ./testServer 8600 

“testServer”具有正在写入的日志文件。 它们位于“LOGS”目录中。 每次启动“testServer”时,都会创build一个新的日志。 我想要做的是将目录中的最新日志文件“尾巴”到stdout / stderr。

我试着添加:

 CMD ["/bin/sh", "-c", "tail $( ls -Art /LOGS | tail -n 1 ) > out_server.log 2>&1"] 

到Dockerfile(然后重build图像),但没有奏效。

如何才能做到这一点?

TIA

这里有两个问题。

  1. 您定义了一个ENTRYPOINT并且您正在尝试使用CMD运行命令。 Docker使用一个进程启动一个容器,当你定义两个进程时, CMD作为附加的参数被附加到ENTRYPOINT 。 容器作为pid 1运行的是:

    /bin/sh -c './testServer 8600 /bin/sh -c "tail $( ls -Art /LOGS | tail -n 1 ) > out_server.log 2>&1"'

    除非testServer运行额外的参数,否则它们将永远不会被使用。

  2. 如果你正在运行的命令确实起作用了,它会把所有的东西都输出到容器内的/out_server.log,而不是标准输出,并且一旦到达input结尾就会停下来。 如果这是你的pid 1,容器也会在那个时候退出。

要解决这个问题,你可以创build一个entrypoint.sh类似于:

 #!/bin/sh ./testServer 8600 & sleep 2 # give testServer time to create the newest log exec tail -f $( ls -Art /LOGS | tail -n 1 ) 

该入口点在后台启动testServer,然后用exec运行尾部。 exec取代pid 1,使信号通过。

更新您的Dockerfile到:

 FROM ubuntu:16.04 # This apt-get line shouldn't be needed unless something else # needs the possibly outdated package repo list # RUN apt-get update # Removing this volume, you can create it from a docker-compose.yml # VOLUME ["/LOGS"] COPY entrypoint.sh testServer / RUN chmod 755 /entrypoint.sh /testServer ENTRYPOINT [ "/entrypoint.sh" ] 

有关我为什么删除VOLUME行的更多详细信息,请参阅我的博客文章 。

如果这是一个要求,我会重新configurationUbuntu的输出系统日志。 这里是一个例子

Interesting Posts