スクリプト化された Dockerfile と比較して、宣言型のクラウドネイティブ ビルドパックはいくつかの新しいシナリオをサポートします。 コンテナはどこにでもあるコンテナはほとんどのソフトウェア配信パイプラインに遍在しており、直接目に見えない場合もありますが、舞台裏で存在しています。 Kubernetes、通常の Docker ホスト、サーバーレス関数、または他の多くのオーケストレーション プラットフォームでソフトウェアを実行する場合でも、コンテナーは不変で実行可能なソフトウェア成果物を表します。 アプリケーションのソース コードを実行中のアプリケーションに変換するには、中間のコンテナー ビルド ステージが必要であり、ソフトウェアをコンテナーに変換する非常に一般的な方法は Dockerfile を使用することです。 DockerファイルDockerfile からコンテナを構築するのはスクリプト化されたアプローチであり、Dockerfile に含まれる内容のほとんどは、基本的にソフトウェアの構築や依存関係のインストールなどに必要なコマンドです。これは、Dockerfile の使用方法を学習するための学習曲線が緩やかであり、既存のビルド スクリプトをそれほど労力をかけずに Dockerfile に移植できることも意味します。 しかし、高品質のコンテナイメージを作成するのは簡単ではないことがわかりました。インターネットには、小さくて安全なベストプラクティスイメージを作成するためのガイドが満載です。通常、次の点を中心に展開します。
以下は、NodeJS アプリケーションに対してこれらの推奨事項の一部を実装する Dockerfile を示しています。 2 段階のビルドを使用して小さなイメージを作成し、非ルートとして実行し、操作を慎重に順序付けてキャッシュを改善します。 ノードから: 16.13 .1 - alpine3 .14 AS ビルダー 高品質の Dockerfile を作成するにはかなりの労力が必要であり、場合によっては Dockerfile が別のプロジェクトの Dockerfile の単なるコピーになることもあります。これにより Dockerfile が断片化され、複数のコンテナを持つ組織ではすぐに管理不能になる可能性があります。 ビルドパックビルドパックは、特定のタイプのほとんどのアプリケーションでは、アプリケーションのソース コードをコンテナーに変換することはほぼ同じであるという考えから生まれました。つまり、このプロセス用に再利用可能なプログラムを設計できるということです。このコンセプトは、Heroku によって開始され、Cloud Foundry、Google App engine、Gitlab、CircleCI などに採用されて以来、10 年以上にわたって開発されてきました。 コミュニティは、セキュリティとベストプラクティスのレベルが異なる各アプリケーションに対して断片化された Dockerfile を使用するのではなく、高品質のコンテナ イメージ ビルドを提供できるように懸命に取り組んでいます。 コンテナイメージを構築するための宣言的なアプローチビルドパックを使用する場合は、ビルドパックがコンテナを構築する方法を理解する必要があります。 Dockerfile を使用してコンテナを構築する方法をスクリプト化するのではなく、コンテナにパッケージ化するものを宣言し、ビルドパックに詳細を判断させることができます。 ビルドパックはいくつかのフェーズを実装しますが、そのうちの 2 つは次のとおりです。
{ コンテナ イメージはさまざまな形式でメタデータを保持し、ビルドパックは多くの場合、環境変数を使用してメタデータ設定を宣言します。以下は、Paketo image-labels ビルドパックを使用して、環境変数を使用してコンテナ イメージに標準の org.opencontainers.description ラベルを設定する例です。環境変数の設定は、ビルド設定を宣言するための一般的な形式である project.toml ファイルを介して行われます。 [[ 建てる。 環境]] Buildpacks のこの宣言型 API を理解することは、開発者にとって不可欠です。開発者は Dockerfiles を気にする必要はなく、ビルドパックの宣言型 API を知っておく必要があります。 再現可能なビルド、安全な配信チェーンビルドパックは、再現可能なビルドを実現することを目指しています。ビルド プロセスは完全に決定論的であり、同じ入力で実行すると同じ出力が生成されます。これにより、どのアプリケーション バイナリまたはソースがコンテナーにパッケージ化されているかを正確に検証し、悪意のあるアプリケーションがコンテナーにパッケージ化されるのからソフトウェア配信チェーンを保護することができます。 Dockerfiles を使用してイメージを構築する場合、まったく同じ入力が提供された場合でも、コンテナ イメージ (およびそのハッシュ sha256 ダイジェスト) はイメージが再構築されるたびに変更されます。 再現可能なビルドはソフトウェア アーティファクト サプライ チェーン レベル 4 の要件であり、ビルドパックはコンテナー イメージ サプライ チェーンのセキュリティを向上させる重要なツールです。 再現可能なビルドは、コンテナ レイヤーの不要な再構築を回避するための効果的なメカニズムでもあります。 再構築速度とキャッシュの改善Dockerfile 内の各行は、基本的に最終的なコンテナ イメージにレイヤーを追加します。前のレイヤーが変更されない限り、レイヤーはキャッシュされ、再利用されます。先行するレイヤーが変更されると、Docker は再現可能なビルドを適用しないため、後続のすべてのレイヤーが再構築され、変更されます。 ビルドパックでは、各ビルドパックがコンテナ イメージにレイヤーを提供します。ビルドパックの入力が変更されない場合、前のレイヤーが変更されたかどうかに関係なく、ビルドパックのレイヤーは変更されません。さらに、ビルドパックを使用すると、他のビルドパックによって生成されたレイヤーに影響を与えずに、個々のレイヤーを置き換えることができます。 コンテナ ベース イメージを更新する必要がある場合 (たとえば、セキュリティ上の問題のため)、他のアプリケーション レイヤーを再構築せずに、コンテナ イメージにそのレイヤーを再インストールできます。 Dockerfile ベースのワークフローを使用してこれを実現するのは困難です。 シングルレイヤー リベースは、コンテナ イメージのビルド時間だけでなく、コンテナのデプロイメントにも大きな改善をもたらします。特定のベースイメージを使用する 10 個のサービスがあると想像してください。セキュリティ上の問題によりこのベースイメージを更新する必要がある場合、Dockerfile に対してビルドを行うと、すべてのイメージのすべてのレイヤーが再構築されます。これにはビルド時間がかかり、10 個の新しいイメージ全体がダウンロードされます。ビルドパックのリベース メソッドを使用する場合、新しい共有ベース イメージを取得するだけで済みます。 コンテナは42年も経っているんですか?ビルドパックを使用してコンテナをビルドすると、予期しないタイムスタンプが発生します。 $ docker イメージls これは再現可能なビルドの副作用です。再現可能なビルドを実現するために、コンテナ イメージの違いを引き起こす時間依存データを回避すべく、時間が固定されます。ビルドパックは、古いファイル形式との互換性のために選択された、タイムスタンプの起点が 1980 00:00:01 であるイメージをビルドします。 ビルドパックを使用する際の役割ビルドパックを使用してコンテナを構築する場合、次の 2 つの役割があります。
この関心の分離は、プラットフォーム ビルド オペレーターがコンテナ イメージを制御できるため、複数のコンテナ イメージを管理する組織にとって非常に価値があります。たとえば、実行中のイメージでセキュリティ上の問題が発見された場合、ビルダーの実行イメージを変更することで、新しい実行中のイメージを使用してすべてのコンテナを再構築できます。上で述べたように、これは非常に効率的なレイヤーのリベースになります。 Dockerfile を使用すると、すべてのアプリケーション Dockerfile のベースイメージを更新する必要があり、すべてのコンテナ イメージ レイヤーの再構築がトリガーされます。 コンテナにはどのようなソフトウェア部品表が含まれていますかビルドパックが Dockerfile ビルド プロセスを強化する方法の 1 つの例は、ビルド関連のメタデータをコンテナー イメージに添付する方法です。ソフトウェア プロジェクトには多くの依存関係が含まれており、これらの依存関係に関する情報はイメージのビルド時にコンテナー イメージに埋め込まれます。 ソフトウェア部品表 (SBOM) は、コンテナ イメージに含まれるコンポーネントの構造化されたリストです。これを使用すると、SBOM を既知のセキュリティ問題と比較することで、安全なソフトウェアのみが使用されていることを確認できます。 SBOM は、どのソフトウェア ライセンスがソフトウェアを管理しているかなどを確認するためにも使用できます。CycloneDX と SPDX は、構造化された SBOM データの 2 つの一般的な標準です。 以下は、NodeJS プロジェクトの SBOM からの抜粋です。ここでは、使用されている Node エンジンの正確なバージョンと、それを提供するビルドパックを確認できます。 { SBOM を使用してソフトウェアを保護することは、コンテナ イメージ スキャナーの使用を強力に補完します。 SBOM はビルドパックから作成されるため、配信チェーンを正確かつ明確に識別します。コンテナ イメージ スキャナーは、コンテナの実際のコンテンツからこのバージョンを差し引く必要があるため、精度は低くなります。 Buildpacks の使い方は?Cloud Native Buildpacks では、ビルド プロセスと Buildpacks が、ビルダー イメージとランナー イメージの 2 つのコンテナー イメージに含まれています。ある意味、これは改良された Dockerfile の 2 段階ビルドと見ることができます。次の図は、2 段階の Dockerfile ビルドが Buildpacks にどのようにマッピングされるかを示しています。 NodeJS アプリケーションのビルド ロジックがビルドパックにどのようにマッピングされるかに注目してください (通常、このようなアプリケーション ビルドは複数のビルドパックに分散されます) ビルダー イメージには、順序付けられた一連のビルドパックを使用してビルドを行うためのロジック、ビルドパックのライフサイクル コンポーネントのオーケストレーター、および実行中のイメージへの参照が含まれています。 Dockerfile は線形に処理されるため、Dockerfile とライフサイクル コンポーネントの間には並列処理はありません。検出フェーズでは、ビルドパックはビルドをオプトインまたはオプトアウトし、ライフサイクル コンポーネントがこれを管理します。 最後に、ライフサイクル コンポーネントをトリガーするためのツールが必要です。これは、docker build コマンドに非常に似ています。これにはさまざまなツールがあり、最もよく知られているのは pack と Tekton ですが、CircleCI や Gitlab などの商用継続的インテグレーション ベンダーもビルドパックを使用したビルドをサポートしています。 pack を使用した Github アクション ワークフローの例については、こちらをご覧ください。 結論は経験豊富な Dockerfile 作成者は、Dockerfile からビルドパックに移行するときに詳細を制御できなくなると感じるかもしれませんが、上記の利点により、ビルドパックの使用にオープンな心で取り組むことができるようになることが期待されます。ほとんどの開発者はビルドパックを気に入ると思います。コンテナの構築と Dockerfile の保守は主な焦点ではなく、むしろアプリケーションのデプロイに必要な手順でした。ビルド プラットフォーム オペレーター、SRE、セキュリティ チームにとって、ビルドパックはコンテナ イメージとコンテナ イメージに組み込まれた成果物に対する制御を復元するため、非常に便利です。 Dockerfile をクラウドネイティブ ビルドパックに置き換えると、コンテナ イメージの構築方法が変わります。 開発者や組織にとって、宣言部分に重点を置くことが重要です。コンテナをどのように構築するか、また何を構築するかを宣言する方法を学ぶことが最も重要になります。 ビルドパックは完璧ですか? そうでもないです。この記事を書いている間、冒頭で提案した 2 段階 Dockerfile のリーン コンテナー ビルドを再現しようとしましたが、完全には実現できず (Paketo ビルダーを使用)、結果として得られるコンテナーのサイズが少し大きくなってしまいました。ただし、ビルドパックは将来改善されることを期待しています。 ビルドパックを使用してコンテナにパッケージ化するのが難しいアプリケーションもいくつかあります。たとえば、コンテナ (VM スタイルのコンテナ) にパッケージ化された従来のモノリシック アプリケーションは、カスタム ビルドパックなしでは実装が困難です。このようなアプリケーションはビルドパックとうまく連携せず、Dockerfile の低レベルの制御が必要になる可能性があります。これはおそらく、コンテナ パッケージングで認識しておくべきことです。 |
<<: K8S ステートレスおよびステートフル、初心者向けガイド!
>>: 夏休み中にオープンソースを学んで賞品を獲得しましょう。 2022 Red Hat ITプロフェッショナル総合スキルコンテストにぜひご参加ください
可観測性は、多くの場合、ログ、メトリック、トレースの 3 つの柱のコンテキストで定義されます。最新の...
上場廃止の悪夢からようやく脱したPerfect Diaryの親会社Yatsen E-Commerce...
さらに読む:カリフォルニア大学ユー・ヨンフー校がアリババの投資について語る:夢、責任、挑戦UCの過去...
北京はここ数日スモッグに覆われ、街全体が灰色に染まっている。15日の早朝には散発的に雪が降ったものの...
意外にも、ビデオマーケティング「IT敗者の告白」の後、SKYCCの販売量は実際に急上昇しました。ニュ...
序文:水君網は長い間A5に到達していません。この間、百度による3回の大きなアルゴリズム変更を経験し、...
[51CTO.com からのオリジナル記事] ビッグデータ時代の到来により、従来のストレージ アーキ...
起業家ラウンドテーブル円卓会議ゲストFanli.com CEO 葛永昌氏Tongcheng.com ...
cmivpsは以前のモバイルcmi国際ラインを変更したようです。公式も大量のサーバーを追加しました。...
Kubernetes クラスターで HTTPS プロトコルを使用するには、証明書マネージャーと自動...
[[356315]]企業は運用スピードの向上、柔軟な運用、コスト削減を必要としており、クラウド プラ...
2018年最もホットなプロジェクト:テレマーケティングロボットがあなたの参加を待っていますウェブサイ...
多くのマーケターが「コンテンツマーケティング」について語っていますが、コンテンツマーケティングだけで...
v5.net は香港データセンター事業に注力しており、香港国際 BGP 回線、香港 CN2+BGP ...
私はいくつかの Taobao アフィリエイト ウェブサイトを所有しており、それらを慎重に運用および最...