情景
一般情况下,我们都会映射一个外部目录到docker里边,docker里边的程序会将数据,包括
日志写在这个目录里,这个时候,日志是docker内外都可见的。例如常用的ngingx部署方法。
[class_tong @ https://www.cnblogs.com/hugetong/]
背景
logrotate是一个日志回滚的工具,它会根据时间或文件大小规则,对日志文件进行切分以及删除
操作。
logrotate本身不是一个daemon进程,他是一个crond任务,每天调用一次。
另外,logrotate在做了文件操作之后是需要通知写日志的进程的,一般是发一个信号。
这个操作需要在logrotate的配置文件中显式设置。
方法
目前,我能总结出的方法。
一
在docker内,除了启动你的服务外,同时启动一个crond任务,在docker内完成logrotate工作。
如下生成docker镜像:注意红字
FROM nginx:1.11 # Remove sym links from nginx image RUN rm /var/log/nginx/access.log RUN rm /var/log/nginx/error.log # Install logrotate RUN apt-get update && apt-get -y install logrotate # Copy MyApp nginx config COPY config/nginx.conf /etc/nginx/nginx.conf #Copy logrotate nginx configuration COPY config/logrotate.d/nginx /etc/logrotate.d/ # Start nginx and cron as a service CMD service cron start && nginx -g ‘daemon off;‘
二
在docker host上。显式的对映射出来的目录文件进行logrotate的配置,这样
传统情况下的一般配置,并没有什么不同。除了为服务进程发信号的方式,因为
我们需要将信号发到docker里面去。当然,这也没什么大不了的,方法如下:注意红字
$ sudo vi /etc/logrotate.d/test /home/test/logs/*log { rotate 90 missingok ifempty sharedscripts compress postrotate docker exec -it nginx-test nginx -s reload > /dev/null 2>/dev/null || true endscript }
三
在方法三面前,前两者都弱爆了。它是这样的:在docker里边安装好logrote(这是必须的),
同时在docker外边的host上,安装包:docker-logrotate
我们看,这个包里都有啥:
[[email protected] ~]# rpm -ql docker-logrotate /etc/cron.daily/docker-logrotate /usr/share/doc/docker-logrotate-1.12.86 /usr/share/doc/docker-logrotate-1.12.86/README.docker-logrotate
只有一个cron的task,我们再来看这个task都做了什么:
[[email protected] ~]# cat /etc/cron.daily/docker-logrotate #!/bin/sh LOGROTATE=true [ -f /etc/sysconfig/docker ] && source /etc/sysconfig/docker if [ $LOGROTATE == true ]; then for id in $(docker ps -q); do exec $(docker exec $id logrotate -s /var/log/logstatus /etc/logrotate.conf > /dev/null 2>&1) done fi exit 0
它调用了,所有docker里边的logrotate。
于是,我们只需要在docker内正常的每一个docker配置logrotate就行了,host会根据这个任务自动调用他们。
[class_tong @ https://www.cnblogs.com/hugetong/]
结论
综上,我们推荐,并仅推荐方法三。
---
完
原文地址:https://www.cnblogs.com/hugetong/p/12090417.html