TechFeed Conference 2022 Pick up

コンテナビルド最新事情 2022版 ~TechFeed Conference 2022講演より

本記事は、2022年5月に開催されたTechFeed Conference 2022のセッション書き起こし記事「コンテナビルド最新事情 2022版(inductor⁠⁠ — TechFeed Conference 2022講演より」を転載したものです。オリジナルはTechFeedをご覧ください。

それではこれから、私@_inductor_が「コンテナビルド最新事情」ということでお話をしていきます。

今日は主に4つの話をしていきます。ちょっと駆け足になってしまいますが、コンテナビルド高速化に向けた4つの機能およびポイントについてお話しします。

今回お話すること
今回お話すること

Dockerfileの新しい記法

まず最初に、Dockerfileに新しい記法がいくつか増えています。それを実装しているのは BuildKitと呼ばれるDocker発のオープンソースのソフトウェアがベースになっていて、Dockerfileの中で

# syntax=docker/dockerfile:1.4

という記述を最初に追加してあげると利用できるようになっています。

Dockerfileの新しい記法
Dockerfileの新しい記法

たとえば今、ここのスライドの例の中に「RUN –mount」という書き方があって、これを使うとビルド中にだけ一時的に利用したい依存関係、あるいは保存しておきたいメタデータだけど「実際に動くコンテナには不要なもの」などをビルドツール内にキャッシュしておくことができます。

RUN -mountを使うと一時的に保存したいメタデータなどをビルドツール内にキャッシュできる
RUN -mountを使うと一時的に保存したいメタデータなどをビルドツール内にキャッシュできる

このマウントタイプにはいくつか種類があるのですが、今回は3つご紹介します。

1つ目が「cache」です。今言ったビルドキャッシュの保存領域の話になっています。

ビルドキャッシュの保存領域「cache」
ビルドキャッシュの保存領域「cache」

2つ目がGitHub Actionsで使える「type=gha」というのがあって、これはGitHub Actionsのyamlの中でDockerが公式に出しているbuild-push-actionのキャッシュを、 GitHub Actions のリモートキャッシュでいい感じにラップしてくれるものです。これを有効化するだけでも中間ステージがキャッシュされて爆速になります。

GitHub Actions用のtype=gha
GitHub Actions用のtype=gha

最後にご紹介するのが、⁠--mount=type=secret」⁠--mount=type=ssh」で、これはDockerビルドの中でプライベートなリポジトリをpullしてくるとき、あるいはcloneしてくるときに使うことができます。これを使うとコンテナイメージ内にsshの鍵などを含めなくてもよくなるので、イメージとしてもセキュアになりつつ、必要なものだけを取り出すことができます。

プライベートなリポジトリをpullするときに使えるsecret/ssh
プライベートなリポジトリをpullするときに使えるsecret/ssh

ここまで3つのマウントタイプについてご紹介してきました。ちなみにここに書いてあるRUN命令の中で、複数行書くためのヒアドキュメントも最近のアップデートで使えるようになっています。

COPYの新しいフラグ「--link」

続いて、COPYの新しいフラグについてご紹介します。

COPY命令を使うと、アプリケーションのコードをコンテナのビルドコンテキストに含めることができるんですけど、これを使うと新しいキャッシュセマンティクスである「cache-from⁠⁠、BuildKitがサポートしているcache-fromの中でキャッシュをうまいこと活用してくれるようになります。

COPYの新しいフラグ「--link」
COPYの新しいフラグ「--link」

これまでマルチステージビルドの中では、COPYの前のビルドコンテキストが変わってしまうとCOPYもやり直しになっていたのですが、--linkを使うとその辺が全部キャッシュが効くようになるので、ビルドが速くなります。

こんな感じですね。

--linkを使うとこれまで効かせづらかったキャッシュが効くようになるのでビルドが高速化する
--linkを使うとこれまで効かせづらかったキャッシュが効くようになるのでビルドが高速化する

cache-fromのところで指定した上でDockerfile に–linkを追加するだけなので、非常に簡単にビルドを高速化することができます。CIなどではとくに顕著で、これまでCIでなかなか中間ステージのキャッシュを効かせられなくて悩んでいた人もいると思うんですけど、これを追加してあげることによってCIが本当に1秒とかで終わるようになって最高です。

まとめ

というわけで、複数のDockerfileの新しい記法についてご紹介してきましたが、このBuildKitのオプションをうまく使ってあげることで、CIのビルドが爆速にできるようになります。

今回のまとめ - BuildKitはいいぞ!!!
今回のまとめ - BuildKitはいいぞ!!!

今回はGitHub Actionsとのインテグレーションが非常に便利なので、それをベースにご紹介しましたが、同じ仕組みをCircleCIあるいはGitLab、あるいはJenkinsでも似たような書き方をすることができます。なので「 BuildKit で新しくサポートされた書き方を皆さんもぜひ使ってみてください」というお話でした。

参考リンク、それから今回ご紹介したスライドのリンクは後でTwitterなどに張っておこうと思います。

というわけで私からの発表は以上になります。ご清聴ありがとうございました。

おすすめ記事

記事・ニュース一覧