[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

---

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM