LoginSignup
0
1

CloudNativeBuildpacksを使ったSpringBootDockerイメージの作り方

Posted at

はじめに

近年、アプリケーションをコンテナ化する流れが一般的になっています。
特に、Spring Boot のようなクラウドネイティブなフレームワークを使う場合、アプリケーションのコンテナ化は容易で、開発の流れに組み込むメリットも大きいです。

しかし、従来の手動で Dockerfile を記述してコンテナイメージを作成・運用する方法には、以下のような課題があります。

  • ベースイメージやライブラリに既知の脆弱性が含まれているリスクがある
  • Dockerfile は個人の経験や知識に依存するため、ベストプラクティスから外れた内容になりがち
  • Dockerfile の内容が陳腐化して、セキュリティホールやパフォーマンス低下を招く可能性がある

こうした課題から、最適化されたセキュアなコンテナイメージを維持・更新するのは難しい問題です。

Spring Boot 2.3 以降では、こうした課題を解決し、より安全で高パフォーマンスなコンテナイメージを作成する方法として、Cloud Native Buildpacks (CNB) が標準で提供されています。
CNB を使用することで、開発者はアプリケーションのソースコードさえ用意すれば、以下の作業を自動化することができます。

  • ベストプラクティスに沿った最新のベースイメージ・ライブラリの選択
  • アプリケーションコードと依存ライブラリのレイヤー分離による最適化
  • 最適化された Docker イメージのビルド

つまり CNB は、常に最新のベストプラクティスに基づいてセキュリティ、パフォーマンス、最適化面で適切な判断と設定を自動的に行ってくれるため、運用が大幅に効率化できます。

本記事では、Spring Boot Gradle プロジェクトで、この CNB を活用してコンテナイメージをビルドする手順を紹介します。

Gradle で CNB を使ってコンテナイメージを構築する

Spring Boot Gradle プロジェクトで、CNB を使ってコンテナイメージを作成するには、bootBuildImage タスクを実行します。
このタスクは、内部で CNB を利用し、最適なコンテナイメージのビルドを自動化してくれます。

事前準備

bootBuildImage タスクは、bootJar タスクの出力を使用するため、プロジェクトには Spring Boot Gradle プラグインに加えて、java プラグインを適用する必要があります。

build.gradle
plugins {
    id 'java'
    id 'org.springframework.boot' version '3.2.5'
}

また、このタスクは Docker デーモンへのアクセスを必要とするため、Docker サービスが稼働していることを確認しましょう。

bootBuildImage タスクを実行する

以下のコマンドで、bootBuildImage タスクを実行できます。

$ ./gradlew bootBuildImage

カスタマイズ

必要に応じて、bootBuildImage タスクの設定をカスタマイズできます。
例えば、イメージ名を指定する場合は、build.gradle に以下を追記します。

build.gradle
tasks.named("bootBuildImage") {
    imageName = 'demo:0.0.1-SNAPSHOT'
}

コマンドライン引数で指定することもできます。

$ ./gradlew bootBuildImage --imageName=demo:0.0.1-SNAPSHOT

他にも、ベースイメージの指定や Docker ホストの指定など、様々なオプションを設定可能です。

実行結果の確認

イメージのビルド後、docker images コマンドで新しいイメージが作成されたことを確認できます。

$ docker images
demo                     0.0.1-SNAPSHOT    edd8f...    4 seconds ago   300MB

コンテナの実行

作成したイメージからコンテナを実行するには、以下の Docker run コマンドを実行します。

$ docker run -p 8080:8080 demo:0.0.1-SNAPSHOT

Spring Boot アプリケーションは、デフォルトでコンテナ内の 8080 番ポートで実行されるため、-p 8080:8080 を指定して、外部からアクセスできるようにホストのポートをマッピングしています。

最後に、ブラウザで http://localhost:8080 にアクセスすれば、アプリケーションの出力を確認できます。

さいごに

以上、CNB を使って Spring Boot アプリケーションのコンテナイメージをビルドする方法を紹介しました。

アプリケーションのコンテナ化は避けて通れない道となっていますが、CNB によって開発者は最小限の手間でベストプラクティスに沿ったセキュアで最適化された Docker イメージを自動構築できます。
特に Spring Boot では CNB の導入が非常に簡単ですので、ぜひ活用されてみてはいかがでしょうか。

参考

Spring Boot Gradle プラグインリファレンスガイド - ドキュメント (pleiades.io)
Spring Boot コンテナイメージ - リファレンスドキュメント (pleiades.io)
Configuring Gradle Tasks in Spring Boot 3 | Baeldung
Dockerfile の属人化による脆弱性を防げ ベストなイメージが作成可能な Cloud Native Buildpacks の使い方 - ログミー Tech (logmi.jp)

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1