情景
一般情況下,我們都會映射一個外部目錄到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/]
結論
綜上,我推薦,並僅推薦方法三。
---
完