logrotateプロセスをdocker化


インフラのMicroservice一貫でlogroateプロセスをdocker化してみました。

ファイル構成

ディレクトリ構成

Dockerfile
logrotate.conf
logrotate.d/hoge

Dockerfile

FROM sequenceiq/logrotate 
ADD logrotate.d /etc/logrotate.d/
ADD logrotate.conf /etc/logrotate.conf

logrotate.conf

weekly
su root
rotate 4
create
include /etc/logrotate.d

logrotate.d/hoge

/rails/shared/log/rails.log
/var/log/nginx.log
{
  daily
  rotate 7
  missingok
  compress
  ifempty
  delaycompress
  su root
  copytruncate
  sharedscripts
}

Docker image build&&push

私の場合ECRを使ってDockerイメージを管理してるので以下の手順を実行します。

ECRログイン

eval "$(aws ecr get-login --region ap-northeast-1)"

docker build

docker build -t xx.dkr.ecr.ap-northeast-1.amazonaws.com/logrotate .

docker push

docker push xx.dkr.ecr.ap-northeast-1.amazonaws.com/logrotate

docker run

以下のコマンドでdockerコンテナを立ち上げます。

docker run -d \
    -v /var/log:/var/log \
        -v /rails/shared/log:/rails/shared/log \
  -e CRON_EXPR="* * * * *" \
  xx.dkr.ecr.ap-northeast-1.amazonaws.com/logrotate

その他いろんななオプションが使えます。

docker run -d \
  -v /var/log:/var/log \
  -v /rails/shared/log:/rails/shared/log \
  -e "LOGS_DIRECTORIES=/var/log /var/log/nginx" \
  -e "LOGROTATE_COPIES=10" \
  -e "LOGROTATE_SIZE=10G" \
  -e "LOGROTATE_COMPRESSION=compress" \
  -e "LOGROTATE_INTERVAL=daily" \
  -e "LOGROTATE_DATEFORMAT=-%Y%m%d" \
  xx.dkr.ecr.ap-northeast-1.amazonaws.com/logrotate

ECSを利用してる場合

ECSを利用してる場合は以下の手順でtask-definitionが作れます。

task_def.jsonファイル

{
    "family": "logrotate",
    "containerDefinitions": [
        {
            "name": "logrotate",
            "image": "xx.dkr.ecr.ap-northeast-1.amazonaws.com/logrotate",
            "cpu": 0,
            "memoryReservation": 32,
             "environment": [
            {
              "name": "CRON_EXPR",
               "value": "* * * * *"
            }
            ],
             "mountPoints": [
               {
                 "sourceVolume": "common_log",
                 "containerPath": "/var/log"
               },
               {
                 "sourceVolume": "rails",
                 "containerPath": "/rails/shared/log"
               }
            ],
            "dockerLabels": {
                "title": "",
                "p-r": ""
            }
        }
    ],
     "volumes": [
    {
    "name": "common_log",
    "host": {
      "sourcePath": "/var/log"
      }
    },
    {
    "name": "rails",
    "host": {
      "sourcePath": "/rails/shared/log"
      }
    }
    ]
}

task-def作成

aws ecs register-task-definition --cli-input-json file://task_def.json

クラスターにdockerコンテナをアップする手順は省略します。

感想

案外にシンプルで簡単構築できました。

logrotateの設定をdockerのコードで管理できるようになりました!!
task-defのバージョン番号だけみれば最新のlogroate設定になってることを確認できるので
対応漏れ減らせそう

ただ、同じ設定なのにサーバごとにコンテナ立ち上げるのちょっとめんどい。。。各コンテナが落ちてないか監視も必要だろうし

場合によってはNFSやrsyncとかでログをすべて一箇所に集めてそこにlogrotate用dockerコンテナを立ち上げておくこともよいかもです。