之前寫過一篇在宿主機上的nginx日志分割,現在應為項目運行在docker容器里面,但是容器中並不像宿主機那樣安裝了crontab定時任務,雖然可以將crontab打包進鏡像,但是應為項目沒有打包進去,所以只能只能選擇其他的解決方案了。
下面我來說明一下這邊的解決方案:
在創建好鏡像以后,還需要通過docker run 命令來運行生成的鏡像文件。但是run就需要通過參數來設置容器的一系列配置。我這里選擇的是容器的host網絡模式:
什么是host網絡模式:簡單的來說就是使用宿主機的ip地址,但是使用不同的端口區分不同的容器。這樣錯的好處一個是可以通過lsof 工具操作,另一個不用修改太多次。
來說一下我的操作過程:
1:docker build -t imagesName . 創建鏡像
2:docker run imagesName -d --name=myname --net=host -v $(pwd)/logs/nginx:/var1/log/nginx imagesName
來說明以下:-d 就是后台運行的意思。
--name就是運行名字的容器。
--net指定host網絡模式
-v 把 nginx 的日志綁定掛載到了當前目錄下的 logs 目錄下,這是后會在當前路徑下創建一個logs文件夾
注意:/var/log/nginx/access.log是一樣的。只不過是掛在的路徑不一樣
3:編寫一個腳本
#!/bin/bash mv /var/log/nginx/access.log /var/log/nginx/access.log mv /var/log/nginx/error.log /var/log/nginx/error.log kill -USR1 `cat /var/run/nginx.pid`
將腳本添加到當前路徑的logs/nginx路徑下。
4:docker exec 容器ID bash $(pwd)/logs/nginx/腳本命令執行后,或在當前路徑logs/nginx目錄下出現容器中的日志文件。
5:后續就可以使用宿主機的crontab定時任務了。
* * * * * docker exec 容器ID bash $(pwd)/logs/nginx/腳本
這份文檔同樣也適用於openresty,親測有效。
如果要是使用其他微服務需要用戶自己去解決
來補充一下lighttpd微服務的docker容器日志分割,基本和上面的操作是一致的,需要將分割腳本中的mv改成cp后然后使用echo將空值重新寫道容器中的日志文件中,如果使用kill殺掉httpd進程的話,需要重啟docker了,這樣可以避免容器的重新啟動。
docker_mount(){ cp /usr/local/sunsi/third/lighttpd/log/access.log /var/log/lighttpd/access.${datestring}.log cp /usr/local/sunsi/third/lighttpd/log/error.log /var/log/lighttpd/error.${datestring}.log #kill -USR1 `cat /usr/local/si/th/ngi/logs/nginx.pid` echo >> /usr/local/sunsi/third/lighttpd/log/access.log echo >> /usr/local/sunsi/third/lighttpd/log/error.log }
如上代碼所示。歡迎提問和指正