今月のアップデートで,Mackerel コマンドラインツール mkr の公式 Docker イメージが公開された.
mkr monitors { pull / diff / push }
2年前に記事を書いているけど,CircleCI と mkr を組み合わせて Infrastructure as Code にした Mackerel の監視ルールを CI で回している.検証などで,一時的に修正した監視ルールがそのまま残ってしまうことを検知できるので,非常に便利!
ただし,8月末で CircleCI 1.0 のサポートが終了してしまうため,今までの仕組みをコンテナ化して,CircleCI 2.0 に対応させる必要があった.
kakakakakku/mkr
5月時点では,まだ mkr の公式 Docker イメージが公開されていなかったため,自分で Dockerized して,Docker Hub に公開した.
Dockerfile
は非常にシンプルで,Go の Alpine イメージに mkr をインストールしている.
FROM golang:alpine3.7 RUN apk add --no-cache git RUN go get github.com/mackerelio/mkr ENTRYPOINT ["mkr"]
CircleCI 2.0 の設定 .circleci/config.yml
もシンプルで,Dockerized した mkr を実行している.
version: 2 jobs: mkr-monitors-diff: docker: - image: kakakakakku/mkr steps: - checkout - run: mkr -v - run: mkr monitors diff -e -F monitors/monitors.json workflows: version: 2 ci: jobs: - mkr-monitors-diff
mackerel/mkr
そこで,今回やっと公式 Docker イメージが公開されたので,自分で Dockerized したイメージを捨てることができる.
なんと言っても,公式 Docker イメージは「19.9MB」という,圧倒的な軽さになっている.
$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE mackerel/mkr latest 3ce3d6655439 2 weeks ago 19.9MB kakakakakku/mkr latest 74807be95079 7 weeks ago 538MB
その秘密は Docker の「multi-stage builds」を使っているところで,以下の Dockerfile
を見るとわかるように FROM
が2個ある.簡単に言うと golang:alpine3.7
でバイナリを生成しながら,イメージはバイナリを配置した alpine:3.7
になっている.よって,Go 環境を捨てることができ,Alpine + バイナリだけになる.最高!
FROM golang:alpine3.7 RUN apk add --no-cache make git WORKDIR /go/src/github.com/mackerelio/mkr/ COPY . . RUN make build FROM alpine:3.7 RUN apk add --no-cache ca-certificates COPY --from=0 /go/src/github.com/mackerelio/mkr/mkr /usr/local/bin/ ENTRYPOINT ["/usr/local/bin/mkr"]
「multi-stage builds」の詳細は,公式ドキュメントに載っている.
まとめ
- CircleCI と mkr を組み合わせて,Mackerel の監視ルールを CI で回すと便利
- CircleCI 2.0 に対応させるためにコンテナが必要で,今後は公式 Docker イメージが使える
mkr monitors
以外にもオペレーションを効率化できる機能がたくさんあるため,公式 Docker イメージの公開は嬉しい!