なっぱ箱

ゲームとか読書の感想とか時々技術系の話とか

Earthly をお試しで触ってみたメモ

ちょこちょこEarthlyの話を聞くので試しに触ってみた。

Earthly = Makefile + Dockerのようなビルドツール、的な感じ。

Docs

Install

ビルド用のコンテナを立ち上げるので、Dockerは事前に起動しておくこと

$ brew install earthly/earthly/earthly && earthly bootstrap

To reinstall 0.6.19, run:
  brew reinstall earthly
           buildkitd | Starting buildkit daemon as a docker container (earthly-buildkitd)...
           buildkitd | ...Done
           bootstrap | Bootstrapping successful.

$ docker ps
CONTAINER ID   IMAGE                       COMMAND                  CREATED          STATUS          PORTS                                                NAMES
2aa05daf7919   earthly/buildkitd:v0.6.19   "/usr/bin/entrypoint…"   57 seconds ago   Up 57 seconds   127.0.0.1:8371->8371/tcp, 127.0.0.1:8373->8373/tcp   earthly-buildkitd

また各テキストエディタシンタックスハイライト用の拡張が出ているので必要に応じて追加。

とりあえずミニマムなものを作ってみる

メイン定義ファイルは Dockerfile ならぬ Earthfile で作成。

最初のステップで作成する Earthfile はこんな感じ。

VERSION 0.6
FROM golang:1.15-alpine3.13
WORKDIR /go-example

build:
  COPY main.go .
  RUN go build -o build/go-example main.go
  SAVE ARTIFACT build/go-example /go-example AS LOCAL build/go-example

docker:
  COPY +build/go-example .
  ENTRYPOINT ["/go-example/go-example"]
  SAVE IMAGE go-example:latest

main.go については適当なHelloWorldを用意。

順に確認をしていく。

ベース部分

VERSION 0.6
FROM golang:1.15-alpine3.13
WORKDIR /go-example

これがベース部分。これ以降に定義する各ターゲットはこの環境上で実行されることになる(もちろんター別で使用するイメージを変えることも可能)

Goのビルド用ターゲット

build:
  COPY main.go .
  RUN go build -o build/go-example main.go
  SAVE ARTIFACT build/go-example /go-example AS LOCAL build/go-example

やってることは単純で、 Earthlyのビルド用コンテナに必要なファイルを COPY 、そしてコンテナ内でビルドを実行している。

最後がEarthly独自で、 SAVE ARTIFACT でファイルやディレクトリを成果物とすることができる。

なお AS LOCAL 指定をしている場合、対象成果物をホスト側にコピーしてくれるらしい。(ただホスト側にコピーしてくれるのは earthly 実行時に build ターゲットを明示的に指定した時だけっぽい?)

Docker Image作成用のターゲット

docker:
  COPY +build/go-example .
  ENTRYPOINT ["/go-example/go-example"]
  SAVE IMAGE go-example:latest

+build/go-example でビルドターゲットの成果物を指定し、イメージ作成用環境にコピーしている。 最終的に SAVE IMAGE でイメージを作成してくれる。

実行

このEarthfileを実行してみるとこんな感じ。

$ earthly +docker

問題なくイメージが作成され、コンテナの実行が出来た。

$ docker images go-example
REPOSITORY   TAG       IMAGE ID       CREATED          SIZE
go-example   latest    42567ecec34f   29 minutes ago   297MB

$ docker run --rm go-example:latest
Hello, World!

ほかにもイメージの自動pushや、push時にコマンドを実行( terraform apply など)したり、規模が大きくなってきたときに Earthfile を分割してimportできるなどかなり便利そうな印象。

ベースがDockerfileなので入りやすいし、今後ちょとちょこ使ってみようかと思う。