本セッションの登壇者
セッション動画(YouTubeチャンネル登録もお願いします。)
それではこれから、私@_inductor_が「コンテナビルド最新事情」ということでお話をしていきます。
今日は主に4つの話をしていきます。ちょっと駆け足になってしまいますが、コンテナビルド高速化に向けた4つの機能およびポイントについてお話しします。
Dockerfileの新しい記法
まず最初に、Dockerfileに新しい記法がいくつか増えています。それを実装しているのは BuildKitと呼ばれるDocker発のオープンソースのソフトウェアがベースになっていて、Dockerfileの中で
# syntax=docker/dockerfile:1.4
という記述を最初に追加してあげると利用できるようになっています。
たとえば今、ここのスライドの例の中に「RUN –mount」という書き方があって、これを使うとビルド中にだけ一時的に利用したい依存関係、あるいは保存しておきたいメタデータだけど「実際に動くコンテナには不要なもの」などをビルドツール内にキャッシュしておくことができます。
このマウントタイプにはいくつか種類があるのですが、今回は3つご紹介します。
1つ目が「cache」です。今言ったビルドキャッシュの保存領域の話になっています。
2つ目がGitHub Actionsで使える「type=gha」というのがあって、これはGitHub Actionsのyamlの中でDockerが公式に出しているbuild-push-actionのキャッシュを、 GitHub Actions のリモートキャッシュでいい感じにラップしてくれるものです。これを有効化するだけでも中間ステージがキャッシュされて爆速になります。
最後にご紹介するのが、「--mount=type=secret」「--mount=type=ssh」で、これはDockerビルドの中でプライベートなリポジトリをpullしてくるとき、あるいはcloneしてくるときに使うことができます。これを使うとコンテナイメージ内にsshの鍵などを含めなくてもよくなるので、イメージとしてもセキュアになりつつ、必要なものだけを取り出すことができます。
ここまで3つのマウントタイプについてご紹介してきました。ちなみにここに書いてあるRUN命令の中で、複数行書くためのヒアドキュメントも最近のアップデートで使えるようになっています。
COPYの新しいフラグ「--link」
続いて、COPYの新しいフラグについてご紹介します。
COPY命令を使うと、アプリケーションのコードをコンテナのビルドコンテキストに含めることができるんですけど、これを使うと新しいキャッシュセマンティクスである「cache-from」、BuildKitがサポートしているcache-fromの中でキャッシュをうまいこと活用してくれるようになります。
これまでマルチステージビルドの中では、COPYの前のビルドコンテキストが変わってしまうとCOPYもやり直しになっていたのですが、--linkを使うとその辺が全部キャッシュが効くようになるので、ビルドが速くなります。
こんな感じですね。
cache-fromのところで指定した上でDockerfile に–linkを追加するだけなので、非常に簡単にビルドを高速化することができます。CIなどではとくに顕著で、これまでCIでなかなか中間ステージのキャッシュを効かせられなくて悩んでいた人もいると思うんですけど、これを追加してあげることによってCIが本当に1秒とかで終わるようになって最高です。
まとめ
というわけで、複数のDockerfileの新しい記法についてご紹介してきましたが、このBuildKitのオプションをうまく使ってあげることで、CIのビルドが爆速にできるようになります。
今回はGitHub Actionsとのインテグレーションが非常に便利なので、それをベースにご紹介しましたが、同じ仕組みをCircleCIあるいはGitLab、あるいはJenkinsでも似たような書き方をすることができます。なので「 BuildKit で新しくサポートされた書き方を皆さんもぜひ使ってみてください」というお話でした。
参考リンク、それから今回ご紹介したスライドのリンクは後でTwitterなどに張っておこうと思います。
というわけで私からの発表は以上になります。ご清聴ありがとうございました。