我在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”?
答案 0 :(得分:6)
将您的cron文件更改为
07 2 * * * /data/docker/backup_webserver/backupscript.sh > /dev/stdout
这将确保日志转到容器输出
答案 1 :(得分:5)
使用默认cron实用程序(忙箱)
FROM alpine:3.7
# Setting up crontab
COPY crontab /tmp/crontab
RUN cat /tmp/crontab > /etc/crontabs/root
CMD ["crond", "-f", "-l", "2"]
* * * * * echo "Crontab is working - watchdog 1"
/proc/1/fd/1
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"]
* * * * * echo "Crontab is working - watchdog 1" > /proc/1/fd/1
答案 2 :(得分:1)
您可以使用FIFO。
mkfifo path/to/logs
当进程通过FIFO交换数据时,内核会通过所有进程 数据而不将其写入文件系统。因此,FIFO特殊 没有文件系统的内容;文件系统条目只服务于 参考点,以便进程可以使用中的a访问管道 文件系统。
答案 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