1月のバーチャルミートアップのまとめ:BuildKitの機能を使用してイメージビルドを改善する

これは、仮想化と自動化で15年の経験を持つブロガー、講演者、著者である DockerキャプテンNicholas Dilleによるゲスト投稿です。 彼は、ドイツのフライブルクにあるデジタルメディア企業であるHaufe GroupでDevOpsエンジニアとして働いています。 彼はまた、マイクロソフトの最も価値のある専門家でもあります。

この バーチャルミートアップでは、 BuildKitの機能を使用してイメージビルドを改善する方法を共有します。 BuildKit は、キャッシュ、並行性、イメージビルドを複数のステージに分離する機能などの優れた機能を備えた代替ビルダーであり、ビルド環境をランタイム環境から分離するのに役立ちます。

Docker の既定のビルダーは、従来のビルダーです。 これは、Windows のサポートが必要な場合に使用することをお勧めします。 ただし、他のほとんどすべてのケースでは、ビルド時間が短いこと、カスタムBuildKitフロントエンドを使用できること、ステージを並行して構築できること、およびその他の機能があるため、BuildKitを使用することをお勧めします。

以下の完全なリプレイをキャッチし、 スライド を表示して学習してください。

  • BuildKit でキャッシュを構築する – ローカルに存在するイメージに依存する代わりに、buildkit はレジストリから前のイメージの適切なレイヤーを取得します。
  • BuildKit が、ファイルをビルドプロセスにマウントできるようにすることで、資格情報の漏洩を防ぐ方法。 それらはメモリに保持され、画像レイヤーには書き込まれません。
  • BuildKit が SSH 秘密鍵をイメージに追加せずに SSH エージェントソケットをビルドにマウントすることで、SSH を介したリモートシステムへのアクセスをサポートする方法。
  • CLI プラグイン buildx を使用して、さまざまなプラットフォーム用にイメージをクロスビルドする方法。
  • 新しい「Dockerコンテキスト」を使用して、CLIがDockerエンジンの複数のインスタンスへの接続を管理する方法。 Docker エンジンへの SSH リモート処理をサポートしていることに注意してください。
  • 最後に、イメージのビルドを超えたヒント: 実行中のコンテナーのトラブルシューティングを行うときに、ネットワークと PID 名前空間の共有をデバッグ コンテナーで開始できます。 これにより、動作に問題のあるコンテナーを変更せずにデバッグできます。
1月のバーチャルミートアップ1

また、ワークフローで使用するいくつかのツールについても説明しました。

  • goss を使用すると、YAML で表現された構成に一致するようにイメージをテストできます。 Dockerで簡単に使用できるように、「dgoss」と呼ばれる素敵なラッパーが付属しています。 また、イメージに統合するための正常性エンドポイントも提供します
  • trivyは、OSの既知の脆弱性や有名なパッケージマネージャーについてイメージをスキャンするAquaSecurityのOSツールです。

そして最後に、あなたの質問のいくつかに答えました:

デフォルトでビルドキットを使用しないのはなぜですか? 

ワークフローにイメージのビルドが頻繁に含まれる場合は、BuildKit を既定のビルダーとして設定することをお勧めします。 ドッカーデーモン構成で デフォルトでBuildKit を有効にする方法は次のとおりです。

docker-composeはBuildKitで動作しますか? 

BuildKit のサポートは docker-compose 1.25.0 で追加され、DOCKER_BUILDKIT=1 と COMPOSE_DOCKER_CLI_BUILD=1 を設定することで有効にできます。

ビルドキットを使用する利点は何ですか? 

提示された機能に加えて、BuildKit は多くの場合、 ビルドのパフォーマンスも向上 させます。

BuildKit シークレットはいつ使用しますか?(この質問に答えてくれたブランドンミッチェル大尉に特に感謝します)

BuildKit シークレットは、イメージにシークレットを保存せずに、ビルド時にシークレットを使用するのに適した方法です。 これは、sshキーをイメージに保存せずにプライベートgitリポジトリをプルすると考えてください。 ランタイムの場合、多くの場合、作成モードと群れモードをサポートするために異なる作成ファイルであり、それぞれが異なる方法、つまりボリュームと群れのシークレットをマウントします。

Jenkins DockerビルドプラグインのBuildKitを有効にするにはどうすればよいですか? 

私が見つけることができたBuildKitへの唯一の参照は、 Dockerパイプラインプラグインでのサポートの追加に関するものです。

BuildKit はビルドキャッシュをレガシービルダーと共有しますか? 

いいえ、キャッシュは別々です。

テストステップをマルチステージビルドのステージとして持つことについてどう思いますか? 

テスト ステップは、ビルド内の別のステージにすることができます。 テスト ステップで特別なツールをインストールする必要がある場合は、2 番目の最終ステージにすることができます。 マルチステージ ビルドの複雑さが増す場合は、CI/CD ツールをご覧ください。

前のイメージをプルすると、ビルドを行うよりもどのように時間を節約できますか? ダウンロードは、すべての作業をやり直すよりも大幅に高速です。

作成された画像はまだ「同一」ですか、それとも最終的な画像アーティファクトに実際の違いがありますか? 

レガシービルダーとBuildKitは、同一の(または同等の)イメージを生成します。

Docker の検査では、イメージが BuildKit を使用してビルドされたことが示されますか? 

いいえ。

Dockerイメージ/コンテナ(私は次のテクノロジーを使用しています:pythonとDjangoとPycharm)とのデバッグの組み合わせを知っていますか?

いいえ。誰でもここで何かアドバイスがありますか? 

Docker BuildKit は maven Dockerfile プラグインでサポートされていますか? 

質問がSpotifyのDockerfile Mavenプラグイン(メンテナンスされていない)を参照している場合、答えはノーです。 他のプラグインは、環境変数 DOCKER_BUILDKIT=1 を提供するときに BuildKit を使用できる場合があります。 クライアントの動作方法を変更する代わりに、デフォルトでBuildKitを使用するようにデーモンを構成できます(上記の最初の質問を参照)。

CRI-O についてどう思いましたか? 

containerdは可視性を高め、Kubernetes製品のランタイムとして多くのクラウドプロバイダーに採用されていると思います。 しかし、私はCRI-Oの経験がありません。

今後のミートアップの通知を受け取るには、Docker IDまたは Meetup.com を使用して Dockerバーチャルミートアップグループ に参加してください。