Buildkitを使ってDockerfile以外からビルドする

ZOZOテクノロジーズ #4 Advent Calendar 2019 15日目の記事です。 今回はBuildkitを使ってDockerfile以外のsyntaxからImageをBuildしてみたいと思います。

Buildkitとは

BuildkitはMobyが開発しているOSSで、docker buildをより高速にセキュアにbuildできるツールらしいです。Docker18.09に正式統合され、DOCKER_BUILDKIT=1を指定すればBuildkitが有効になります。

github.com

実装の方針

 Buildkitを使ってDockerfile以外からbuildするのですが、今回はyamlファイルからbuildできるようにしたいと思います。buildkitはbuildする際にLLBというDAG構造の中間言語に変換するのでdockerfile以外の記述方法に差し替えることが可能になっています。
 実装方法としてはbuildkitを使うことで有効になるsyntaxフォーマットを利用することで実装できます。syntaxフォーマットを利用するとdocker buildする際に対応したdocker imageをDocker Hubからもってきて、grpc経由でbuildkitdとやり取りしてBuildするらしいです。なのでDocker Hubのアカウントが必要です。
では、これからDockerfileの代替としてSamplefileというものを作っていきます。

実装

コードの実装

 Buildkitリポジトリに書かれているREADMEのExploring LLBの項目でBuildpacksGockerfileを実装している人が紹介されていたので先人の人たちのコードを参考にしてかなり雑に実装したコードが下記のリポジトリになります。cmd/main.goがgrpc関連でbuild.goYamlファイルをparseしてLLBに変換しているコードです。

github.com

buildしてDocker Hubにimageをpushする

 下記のようにDocker HubにpushするためのDockerfileを作成します。

FROM golang:1.12.0 AS builder

WORKDIR /build
COPY . ./
RUN CGO_ENABLED=0 go build -o /sample ./cmd/

FROM scratch
COPY --from=builder /sample /bin/sample
ENTRYPOINT ["/bin/sample"]

次にbuildなのですが、気をつけることとしては、syntaxフォーマットで指定した名前と同じになるようにbuild tagをつけます。 私のDocker Hubのアカウント名はjon20なので下記のコマンドでbuildします。

docker build . -t  jon20/samplefile

buildできたらDocker Hubにpushします。

docker push jon20/samplefile

確認

 下記のようにSamplefile.yamlを適当なディレクトリに作成します。

#syntax=jon20/samplefile
image: hello-world:latest

そしてdockerのbuildコマンドを実行します。

docker build -f Samplefile.yaml -t jon20/sample .

成功すれば下記のようにImageが作成されたことが確認できました。 f:id:jon20:20191214074017p:plain

まとめ

Dockerfile以外から無事buildすることができました。 正直な所、部分部分しか理解できておらず、説明不足な所が多いですがBuildkitに興味を持っていただければ嬉しいです。