通过docker日志查看cron输出,而不使用额外的文件

时间:2017-07-30 00:53:50

标签: docker logging

我在docker容器中运行“cron”。
每天都会执行一个脚本。
这个脚本的输出我希望通过“docker logs”来看到

PID 0的进程是我容器中的cron守护进程。入口点在前台启动cron:

/usr/sbin/crond -f 

据我所知,我可以将脚本输出重定向到文件“path / to / logs”

07 2 * * * /data/docker/backup_webserver/backupscript.sh >> path/to/logs

并按如下所示启动容器以查看日志

"tail -f path/to/logs" 

但是文件“path / to / logs”会在容器的运行时期间增长。
是否有可能从crontab直接登录到“docker logs”?

5 个答案:

答案 0 :(得分:6)

将您的cron文件更改为

07 2 * * * /data/docker/backup_webserver/backupscript.sh > /dev/stdout

这将确保日志转到容器输出

答案 1 :(得分:5)

高山:无需重定向

使用默认cron实用程序(忙箱)

Dockerfile

FROM alpine:3.7

# Setting up crontab
COPY crontab /tmp/crontab
RUN cat /tmp/crontab > /etc/crontabs/root


CMD ["crond", "-f", "-l", "2"]

crontab

* * * * * echo "Crontab is working - watchdog 1"

Centos:

在crontab声明行内重定向到/proc/1/fd/1

Dockerfile

FROM centos:7

RUN yum -y install crontabs

ADD crontab /etc/cron.d/crontab
RUN chmod 0644 /etc/cron.d/crontab
RUN crontab /etc/cron.d/crontab


CMD ["crond", "-n"]

crontab

* * * * * echo "Crontab is working - watchdog 1" > /proc/1/fd/1

enter image description here

答案 2 :(得分:1)

您可以使用FIFO。

mkfifo path/to/logs
  

当进程通过FIFO交换数据时,内核会通过所有进程   数据而不将其写入文件系统。因此,FIFO特殊   没有文件系统的内容;文件系统条目只服务于   参考点,以便进程可以使用中的a访问管道   文件系统。

man fifo

答案 3 :(得分:1)

fifo是必经之路,它也很有用,因为它允许非root用户运行的cron任务写入输出。

我正在使用CMD

ENV LOG_STREAM="/tmp/stdout"
CMD ["bash", "-o", "pipefail", "-c", "mkfifo $$LOG_STREAM && chmod 777 $$LOG_STREAM && echo -e \"$$(env | sed 's/=\\(.*\\)/=\"\\1\"/')\n$$(cat /etc/cron.d/tasks)\" > /etc/cron.d/tasks && cron -f | tail -f $$LOG_STREAM"]

使用/etc/cron.d/tasks

中的任务
* * * * */10 www-data echo hello >$LOG_STREAM 2>$LOG_STREAM

我还在启动时将环境附加到tasks上,因此对任务可见,因为cron本身不会通过它。之所以需要sed,是因为crontab格式要求用env变量加引号-至少它需要用空的var引号,并且如果您有不带引号的空var则无法运行任务。

答案 4 :(得分:0)

@mcfedr是正确的,但是我花了一段时间才了解它,因为它是一个带有变量的单线代码,并且与设置cron有关的一些额外代码。

这可能更容易阅读。它帮助我将其明确地写出来。

# Create custom stdout and stderr named pipes
mkfifo /tmp/stdout /tmp/stderr
chmod 0666 /tmp/stdout /tmp/stderr

# Have the main Docker process tail the files to produce stdout and stderr 
# for the main process that Docker will actually show in docker logs.
tail -f /tmp/stdout &
tail -f /tmp/stderr >&2 &

# Run cron
cron -f

然后,在您的cron中写入这些管道:

* * * * * /run.sh > /tmp/stdout 2> /tmp/stderr