最近在交付專案的時候使用了docker,大家都知道日志是專案定位問題的重要依據,但如果一開始專案本身沒有對日志進行合理切割那就會導致長時間運行的專案日志檔案大得編輯器打不開的情況,這里使用大部分linux都有的logrotate對日志進行每日切割,
這里直接上dockerfile,可以配合備注進行查看
FROM alpine
# 設定時區
RUN apk add tzdata && cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
# 安裝logrotate
RUN apk add logrotate
# 設定作業目錄
WORKDIR /data/
# 撰寫切割規則
RUN echo "/data/*.log {" >> /data/logrotatenode \
# 按每日為單位進行切割
&& echo " daily" >> /data/logrotatenode \
# 備份保留10份
&& echo " rotate 10" >> /data/logrotatenode \
# 備份以日期結尾
&& echo " dateext" >> /data/logrotatenode \
# 延遲壓縮
&& echo " delaycompress" >> /data/logrotatenode \
# 使用壓縮
&& echo " compress" >> /data/logrotatenode \
# 檔案為空時不轉儲
&& echo " notifempty" >> /data/logrotatenode \
# 允許檔案不存在
&& echo " missingok" >> /data/logrotatenode \
# 截斷復制
&& echo " copytruncate" >> /data/logrotatenode \
# 檔案達到1k的時候才儲
&& echo " size=1k" >> /data/logrotatenode \
&& echo "}" >> ./logrotatenode \
# 寫入日志檔案進行測驗
&& echo "hello worlddata:iVBORw0KGgoAAAANSUhEUgAACsIAAARyCAYAAAAXy3LTAAAMTGlDQ1BJQ0MgUHJvZmlsZQAASImVVwdUU0nbnltSSWiBCEgJvYlSpEsJoUUQkCrYCEkgocSYEETsyLIKrgUVEVBXdFXERVdXQNaKvSyKvS8WVJR1sWBD5ZsU0NXz/9/53nPmzpN33nnekrlzZwDQqeVJpbmoLgB5knxZfEQIa0JqGovUBVAwHDCAF3Di8eVSdlxcNIAy2P9b3lwFiLK/5KLk+n78/xU9gVDOBwCJgzhDIOfnQfw7AHgJXyrLB4DoA/XWM/KlSjwJYgMZDBBiqRJnqXGJEmeocZXKJjGeA/EOAMg0Hk+WBYB2C9SzCvhZkEf7OsSuEoFYAoAOGeJAvogngDgS4hF5edOUGNoBh4yveLL+xZkxxMnjZQ1hdS4qIYeK5dJc3sz/sRz/XfJyFYM+7GCjiWSR8cqcYd2u50yLUmIaxD2SjJhYiPUhficWqOwhRqkiRWSS2h415cs5sGaACbGrgBcaBbEpxOGS3JhojT4jUxzOhRiuELRQnM9N1MxdJJSHJWg4a2XT4mMHcaaMw9bMbeTJVH6V9scUOUlsDf91kZA7yP+6SJSYoo4ZoxaIk2Mg1oaYKc9JiFLbYDZFIk7MoI1MEa+M3wZiP6EkIkTNj03JlIXHa+xlefLBfLFFIjE3RoOr80WiVBORw0KGgoAAAANSUhEUgAACsIAAARyCAYAAAAXy3LTAAAMTGlDQ1BJQ0MgUHJvZmlsZQAASImVVwdUU0nbnltSSWiBCEgJvYlSpEsJoUUQkCrYCEkgocSYEETsyLIKrgUVEVBXdFXERVdXQNaKvSyKvS8WVJR1sWBD5ZsU0NXz/9/53nPmzpN33nnekrlzZwDQqeVJpbmoLgB5knxZfEQIa0JqGovUBVAwHDCAF3Di8eVSdlxcNIAy2P9b3lwFiLK/5KLk+n78/xU9gVDOBwCJgzhDIOfnQfw7AHgJXyrLB4DoA/XWM/KlSjwJYgMZDBBiqRJnqXGJEmeocZXKJjGeA/EOAMg0Hk+WBYB2C9SzCvhZkEf7OsSuEoFYAoAOGeJAvogngDgS4hF5edOUGNoBh4yveLL+xZkxxMnjZQ1hdS4qIYeK5dJc3sz/sRz/XfJyFYM+7GCjiWSR8cqcYd2u50yLUmIaxD2SjJhYiPUhficWqOwhRqkiRWSS2h415cs5sGaACbGrgBcaBbEpxOGS3JhojT4jUxzOhRiuELRQnM9N1MxdJJSHJWg4a2XT4mMHcaaMw9bMbeTJVH6V9scUOUlsDf91kZA7yP+6SJSYoo4ZoxaIk2Mg1oaYKc9JiFLbYDZFIk7MoI1MEa+M3wZiP6EkIkTNj03JlIXHa+xlefLBfLFFIjE3RoOr80W" > /data/helloworld.log \
# 每分鐘執行一次備份
&& echo "* * * * * logrotate -v /data/logrotatenode" >> /etc/crontabs/root
# 啟動cron服務 因為本身容器啟動并不會額外幫我們啟動crond,需要我們進行啟動,使用腳本啟動是方便后續需要啟動專案行程
RUN echo "#!/bin/sh" >> start.sh \
&& echo "crond -b" >> start.sh \
# 休眠是為了hold住父行程,如果父行程退出了容器也會被退出
&& echo "sleep 600" >> start.sh \
&& chmod 777 ./start.sh
ENTRYPOINT ["sh", "-c", "./start.sh"]
生成并運行鏡像
# alpinelog 為上面的dockerfile
docker build -f alpinelog -t alpinelog
# 運行容器(不要關閉)
docker run -it alpinelog /bin/sh
# 查看容器id
docker ps -a
# 啟動另一個終端 進入容器
docker exec -it 容器id /bin/sh
可以看到日志切割成功
/data # ls -l
total 12
-rw-r--r-- 1 root root 0 Nov 21 15:22 helloworld.log
-rw-r--r-- 1 root root 1423 Nov 21 15:22 helloworld.log-20211121
-rw-r--r-- 1 root root 168 Nov 21 15:21 logrotatenode
-rwxrwxrwx 1 root root 29 Nov 21 15:21 start.sh start.sh
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/421282.html
標籤:其他
