kakakakakku blog

Weekly Tech Blog : Keep on Learning 👍

たった 19.9MB!mkr の公式 Docker イメージが公開された

今月のアップデートで,Mackerel コマンドラインツール mkr の公式 Docker イメージが公開された.

mackerel.io

mkr monitors { pull / diff / push }

2年前に記事を書いているけど,CircleCI と mkr を組み合わせて Infrastructure as Code にした Mackerel の監視ルールを CI で回している.検証などで,一時的に修正した監視ルールがそのまま残ってしまうことを検知できるので,非常に便利!

kakakakakku.hatenablog.com

ただし,8月末で CircleCI 1.0 のサポートが終了してしまうため,今までの仕組みをコンテナ化して,CircleCI 2.0 に対応させる必要があった.

circleci.com

kakakakakku/mkr

5月時点では,まだ mkr の公式 Docker イメージが公開されていなかったため,自分で Dockerized して,Docker Hub に公開した.

github.com

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 したイメージを捨てることができる.

github.com

なんと言っても,公式 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」の詳細は,公式ドキュメントに載っている.

docs.docker.com

まとめ

  • CircleCI と mkr を組み合わせて,Mackerel の監視ルールを CI で回すと便利
  • CircleCI 2.0 に対応させるためにコンテナが必要で,今後は公式 Docker イメージが使える
  • mkr monitors 以外にもオペレーションを効率化できる機能がたくさんあるため,公式 Docker イメージの公開は嬉しい!