Pulumi と Docker Build Cloud を使用した Docker イメージ ビルドの自動化

このゲスト投稿は、Pulumi のソリューション アーキテクトである Diana Esteves によって寄稿されました。

Pulumi は、Docker を含むあらゆるクラウドまたは SaaS プロバイダー全体のリソース管理を簡素化する Infrastructure as Code (IaC) プラットフォームです。 Pulumi プロバイダー は、便利なツールやベンダーとの統合です。 Pulumi の新しい Docker ビルド プロバイダーは、ビルドをさらに簡単に、より速く、より信頼性の高いものにすることを目的としています。 

この投稿では、Pulumi の新しい Docker Build プロバイダーが Docker Build Cloud と連携して、コンテナー化されたアプリケーションの構築、デプロイ、管理を合理化する方法について詳しく説明します。 まず、Docker Build Cloud と Pulumi を使用してプロジェクトをセットアップします。 次に、このプロバイダーを活用してビルドとデプロイのパイプラインを簡素化する方法を紹介する優れたユース ケースを探ります。  

2400x1260 docker pulumi

Pulumi Docker ビルド プロバイダーの機能

Pulumi Docker ビルド プロバイダーの主な機能は次のとおりです。

  • Docker Build Cloud のサポート: ビルドをクラウドにオフロードし、ローカル リソースを解放します。 ビルドが速いということは、頭痛の種が少ないことを意味します。
  • マルチプラットフォームのサポート: さまざまなハードウェアアーキテクチャで動作するDockerイメージを、汗をかくことなく構築できます。
  • 高度なキャッシング: 冗長なビルドに別れを告げましょう。 Docker Build Cloudを使用するときに利用できる共有キャッシュに加えて、このプロバイダーは、Amazon S3、GitHub Actions、さらにはローカルディスクなどの複数のキャッシュバックエンドをサポートして、ビルドの効率を維持します。
  • 柔軟なエクスポートオプション: Dockerイメージのビルド後の保存先をカスタマイズし、レジストリやファイルシステムなど、ワークフローに必要な場所にエクスポートできます。

Docker Build Cloud と Pulumi を使い始める  

Docker Build Cloudは、Dockerの最新製品で、AMDとArmのビルダーのペアをクラウドで提供し、チームに共有キャッシュを提供することで、最大 39倍高速なイメージビルドを実現します。 Docker Personal、Pro、Team、Business の各プランには、設定された Build Cloud の分数が含まれていますが、Build Cloud Team プランを購入して分数を追加することもできます。 Docker Build Cloud プランの詳細については、こちらをご覧ください。 

この例では、Docker Build Cloud ビルダーを使用して NGINX Dockerfile をビルドします。 Docker Build Cloud ビルダーを作成し、Typescript で Pulumi プログラムを作成し、イメージをビルドします。

前提 条件

ステップ 1: Docker Build Cloud ビルダーをセットアップする

イメージをローカルでビルドするということは、ローカルのコンピューティングとストレージの可用性に左右されることを意味します。 Pulumi を使用すると、ユーザーは Docker Build Cloud を使用してイメージをビルドできます。

Pulumi Docker Build プロバイダーは Docker Build Cloud を完全にサポートしており、個々のチーム メンバーまたは CI/CD パイプラインが、改善されたビルド速度、共有ビルド キャッシュ、ネイティブ マルチプラットフォーム ビルドを十分に活用できるため、新しい機能のロックを解除します。

それでもビルダーを作成する必要がある場合は、以下の手順に従ってください。それ以外の場合は、手順 1C に進みます。

A. Docker Build Cloud アカウントにログインします。

B. my-cool-builder という名前の新しいクラウド ビルダーを作成します。 

Pulumi docker build f1
図 1: 新しいクラウド ビルダーを作成し、my-cool-builder という名前を付けます。

C. ローカル マシンで、Docker アカウントにサインインします。

$ docker login

D. 既存のクラウドビルダーエンドポイントを追加します。

$ docker buildx create --driver cloud ORG/BUILDER_NAME
# Replace ORG with the Docker Hub namespace of your Docker organization. 
# This creates a builder named cloud-ORG-BUILDER_NAME.

# Example:
$ docker buildx create --driver cloud pulumi/my-cool-builder
# cloud-pulumi-my-cool-builder

# check your new builder is configured
$ docker buildx ls

E. 必要に応じて、新しいビルダーが Docker Desktop で使用可能であることを確認します。

Pulumi docker build f2
図 2: Docker Desktop 設定の Builders ビューには、ログインしたアカウントで使用可能なすべてのローカルビルダーと Docker Build Cloud ビルダーが一覧表示されます。

Docker Build Cloud の設定に関する追加のガイダンスについては、Docker のドキュメントを参照してください。

ステップ 2: Pulumi プロジェクトをセットアップする

最初の Pulumi プロジェクトを作成するには、まず Pulumi テンプレートを使用します。 Pulumi は、を介して Pulumi CLI pulumi new と直接統合される何百もの テンプレート をキュレーションしています。特に、Pulumi チームは、Docker Build Cloud 用の Pulumi テンプレートを作成しました。

Pulumi プログラミング モデルは、一般的なプログラミング言語を使用してインフラストラクチャを定義することに重点を置いています。このアプローチでは、既存のプログラミングツールを活用し、ループや条件などの使い慣れた構文を使用してクラウドリソースを定義できます。

Pulumi テンプレートをローカルにコピーするには:

$ pulumi new https://github.com/pulumi/examples/tree/master/dockerbuildcloud-ts --dir hello-dbc
# project name: hello-dbc 
# project description: (default)
# stack name: dev
# Note: Update the builder value to match yours
# builder: cloud-pulumi-my-cool-builder 
$ cd hello-dbc

# update all npm packages (recommended)
$ npm update --save

必要に応じて、Pulumi プログラムを探索します。 この hello-dbc フォルダーには、Pulumi を使用して Dockerfile をイメージにビルドするために必要なものがすべて含まれています。 Pulumi プログラムは、エントリ ポイント (通常は選択したプログラミング言語で記述された関数) から始まります。 この関数は、プロジェクトのインフラストラクチャ リソースと構成を定義します。 TypeScript の場合、そのファイルは index.tsです。 そして、その内容を以下に示します。

import * as dockerBuild from "@pulumi/docker-build";
import * as pulumi from "@pulumi/pulumi";

const config = new pulumi.Config();
const builder = config.require("builder");

const image = new dockerBuild.Image("image", {

   // Configures the name of your existing buildx builder to use.
   // See the Pulumi.<stack>.yaml project file for the builder configuration.
   builder: {
       name: builder, // Example, "cloud-pulumi-my-cool-builder",
   },
   context: {
       location: "app",
   },
   // Enable exec to run a custom docker-buildx binary with support
   // for Docker Build Cloud (DBC).
   exec: true,
   push: false,
});

ステップ 3: Docker イメージをビルドする

pulumi upコマンドを実行して、新しく構成されたビルダーでビルドされているイメージを確認します。

$ pulumi up --yes

ブラウザーのリンクをたどって Pulumi Cloud ダッシュボードに移動し、画像リソースに移動し、builder パラメーターに注意して適切に構成されていることを確認できます。

Pulumi docker build f3
図 3: Image リソースに移動して構成を確認します。

必要に応じて、Docker Build Cloud ダッシュボードでビルド時間の使用状況も確認します。

Pulumi docker build f4
図 4: build.docker.com ビューでは、ユーザーが左側のメニューから [Cloud builders] を選択し、右側に製品ダッシュボードが表示されます。

万丈! Docker Build Cloud と Pulumi を使用して NGINX Dockerfile を構築しました。 これは、新しい Docker Build Cloud ビルダーを作成し、それを Pulumi テンプレートに渡すことで実現されました。 その後、Pulumi CLI を使用して変更をデプロイします。

buildx と BuildKit を使用した高度なユースケース

一般的な buildxBuildKit の機能を紹介するには、次の Pulumi コード サンプルの 1 つ以上をテストします。これらには、マルチプラットフォーム、高度なキャッシュ、およびエクスポートが含まれます。 各機能は、Pulumi Docker ビルド イメージ リソースの入力 (またはパラメーター) として使用できることに注意してください。 

Docker Build Cloud のマルチプラットフォーム イメージ ビルド

Dockerイメージは複数のプラットフォームをサポートできるため、1つのイメージにアーキテクチャやオペレーティングシステムのバリアントが含まれる場合があります。 

次のコード スニペットは、ビルド出力のターゲット プラットフォームを指定するフラグを使用して --platform Docker CLI からビルドを呼び出すのと似ています。

import * as dockerBuild from "@pulumi/docker-build";

const image = new dockerBuild.Image("image", {
   // Build a multi-platform image manifest for ARM and AMD.
   platforms: [
       dockerBuild.Platform.Linux_amd64,
       dockerBuild.Platform.Linux_arm64,
   ],
   push: false,

});

Pulumi プログラムに加えた変更をデプロイします。

$ pulumi up --yes

AWS ECR との間のキャッシュ

Docker イメージのビルド中にキャッシュされたレイヤーを維持することで、ビルドの高速化が可能になり、貴重な時間を節約できます。 ただし、キャッシュされたレイヤーを利用することは、ビルド間で環境がリサイクルされるため、CI/CD パイプラインで歴史的に困難でした。 とcacheToパラメーターを使用するとcacheFrom、プログラムによるビルドでキャッシュ動作を最適化できます。 

Docker イメージ リソースを更新して、キャッシュを利用します。

import * as dockerBuild from "@pulumi/docker-build";
import * as pulumi from "@pulumi/pulumi";
import * as aws from "@pulumi/aws"; // Required for ECR

// Create an ECR repository for pushing.
const ecrRepository = new aws.ecr.Repository("ecr-repository", {});

// Grab auth credentials for ECR.
const authToken = aws.ecr.getAuthorizationTokenOutput({
   registryId: ecrRepository.registryId,
});

const image = new dockerBuild.Image("image", {
   push: true,
   // Use the pushed image as a cache source.
   cacheFrom: [{
       registry: {
           ref: pulumi.interpolate`${ecrRepository.repositoryUrl}:cache`,
       },
   }],
   cacheTo: [{
       registry: {
           imageManifest: true,
           ociMediaTypes: true,
           ref: pulumi.interpolate`${ecrRepository.repositoryUrl}:cache`,
       },
   }],
   // Provide our ECR credentials.
   registries: [{
       address: ecrRepository.repositoryUrl,
       password: authToken.password,
       username: authToken.userName,
   }],
})

AWS ECR の追加リソースの宣言に注目してください。 

ビルドを tar ファイルとしてエクスポートする

エクスポートにより、ビルド呼び出しから得られたイメージを共有またはバックアップできます。 

ビルドをローカル.tarとしてエクスポートするには ファイルで、リソースを変更して入力を含め exports ます。

const image = new dockerBuild.Image("image", {
   push: false,
   exports: [{
       docker: {
           tar: true,
       },
   }],
})

Pulumi プログラムに加えた変更をデプロイします。

$ pulumi up --yes

Pulumi Docker ビルド プロバイダー ガイドを確認して、ビルド引数、ビルド コンテキスト、リモート コンテキストなど、他の Docker ビルド機能を調べてください。

次のステップ

Infrastructure as Code (IaC) は最新のクラウドネイティブ開発を管理するための鍵であり、Docker を使用すると、開発者は DockerfileDocker Compose ファイルを使用してイメージを作成および制御できます。 しかし、異なるクラウドプラットフォームに展開するなど、状況がより複雑になった場合、Pulumiはさらなる柔軟性と高度なインフラストラクチャ機能を提供できます。 Docker Build プロバイダーは Docker Build Cloud をサポートし、コンテナー化されたアプリケーションの構築、デプロイ、管理を合理化し、開発チームがより効果的に連携し、俊敏性を維持するのに役立ちます。

BuildKit を搭載した Pulumi の最新の Docker ビルド プロバイダーは、Docker ビルドの柔軟性と効率を向上させます。 IaC の原則を適用することで、開発者は複雑なシナリオでもコードを使用してインフラストラクチャを管理できます。 つまり、複雑なインフラストラクチャの課題に煩わされることなく、コンテナ化されたワークロードの構築とデプロイに集中できます。

Pulumi のリリースのお知らせとプロバイダーのドキュメントにアクセスして、Docker ビルド プロバイダーの使用を開始してください。 

6 月 25 日に開催される Pulumi と Docker の仮想ワークショップ「 Automating Docker Image Builds using Pulumi and Docker」にご登録ください。

さらに詳しく