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

Ski*_*kip 8 logging docker

我在docker容器中运行"cron".
每天都会执行一个脚本.
我想通过"docker logs"看到这个脚本的输出

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

/usr/sbin/crond -f 
Run Code Online (Sandbox Code Playgroud)

我明白,我可以将脚本输出重定向到文件"path/to/logs"

07 2 * * * /data/docker/backup_webserver/backupscript.sh >> path/to/logs
Run Code Online (Sandbox Code Playgroud)

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

"tail -f path/to/logs" 
Run Code Online (Sandbox Code Playgroud)

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

小智 12

Alpine:无需重定向

使用默认的 cron 实用程序(busybox)

文件

FROM alpine:3.7

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


CMD ["crond", "-f", "-l", "2"]
Run Code Online (Sandbox Code Playgroud)

定时任务表

* * * * * echo "Crontab is working - watchdog 1"
Run Code Online (Sandbox Code Playgroud)

Centos:

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

文件

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"]
Run Code Online (Sandbox Code Playgroud)

定时任务表

* * * * * echo "Crontab is working - watchdog 1" > /proc/1/fd/1
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

  • 我很好奇...为什么将 crontab 复制到 /tmp 然后复制到 /etc/crontabs/root ? (4认同)
  • 我建议你将 ```2>/proc/1/fd/2``` 添加到 CentOS 的答案中,以便捕获发送到 stderr 的错误 (2认同)

Tar*_*ani 11

将您的cron文件更改为以下

07 2 * * * /data/docker/backup_webserver/backupscript.sh > /dev/stdout
Run Code Online (Sandbox Code Playgroud)

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

  • 为什么这样做?我以为`/ dev/stdout`实际上会转到`/ proc/self/fd/1`而对于cron启动的进程,这不会是docker监视器的`/ proc/1/fd/1`文件. (2认同)

kir*_*era 9

@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
Run Code Online (Sandbox Code Playgroud)

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

* * * * * /run.sh > /tmp/stdout 2> /tmp/stderr
Run Code Online (Sandbox Code Playgroud)