[centos][docker][logrotate][nginx] 为docker内的程序配置logrotate的方法

一般情况下,我们都会映射一个外部目录到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

我们看,这个包里都有啥:

[root@caotong ~]# 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都做了什么:

[root@caotong ~]# 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://stackoverflow.com/questions/46323978/logrotate-nginx-logs-not-rotating-inside-docker-container

---