orisano/targd の話
上のツールを作ったので紹介します.
背景
Docker buildを高速に, そして小さいイメージを作るためにMulti-stage buildsを日々活用しています.
コンテナベースのCIを使っていたり, アプリケーションをコンテナ前提で作っているとCIでDocker buildをすることになると思います.
そういう環境においてはbuildkitが使えなかったりします. Multi-stage builds使いにとってbuildkitがないということは死を意味します.
Multi-stage buildsでstageごとに別々の意味をもたせたりするパターンが存在します.
そういったケースではtargetステージを明示的に指定するのですが普通のdocker buildでは指定したステージ以前のステージをすべてbuildしてしまいます.
ステージごとに依存しているステージは別々なので必要のないステージのbuildは無駄でしかありません.
ちなみにMulti-stage buildsの活用については以前した発表があるのでぜひ見てみてください.
orisano/targd
ということでbuildkitが使えない環境向けの必要ないステージをbuildしないためのツールを作りました.
これも非常にシンプルな作りになっていて
- buildkitが内部的に持っているparserを使用してDockerfileのASTを取得
- 深さ優先探索で必要なステージを求める
- 必要なステージだけ記述されたDockerfileを出力
これも前の記事で紹介したDockerfile pipeline toolchainの一つになっていて, 使っていてそれなりに効果があるツールだと思っています.
Multi-stage builds沼に入ってbuildが遅いと感じてbuildkitが使えない状況なら, targdを使ってみてください.
このへんのツールは実際にCIで使うときにコンテナとして提供されていないのが体験として良くなかったので, 提供してあります.
https://hub.docker.com/r/orisano/targd/
コンテナベースのCIなら気軽に使えると思います. ぜひ使ってみてフィードバックをください.
良いと思ったらGitHubでStarしていただけると励みになります.