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が有効になります。
実装の方針
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の項目でBuildpacksやGockerfileを実装している人が紹介されていたので先人の人たちのコードを参考にしてかなり雑に実装したコードが下記のリポジトリになります。cmd/main.goがgrpc関連でbuild.goがYamlファイルをparseしてLLBに変換しているコードです。
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が作成されたことが確認できました。
まとめ
Dockerfile以外から無事buildすることができました。 正直な所、部分部分しか理解できておらず、説明不足な所が多いですがBuildkitに興味を持っていただければ嬉しいです。