🐳

Docker で Spring Boot CLI を使おう

に公開

はじめに

筆者は、プログラミング初心者は最初に Docker が使える環境でコンテナを使うことを学ぶと良いと考えていて、そのための記事をこれまでもたくさん書いてきました。この記事もその1つです。ここでは Spring Boot CLI を Docker で使う方法について紹介します。

Java で人気のフレームワークとして Spring Boot があります。その開発プロジェクトを素早く立ち上げるために、公式のコマンドラインツール「Spring Boot CLI」は非常に便利です。

しかし、あなたもこう感じていませんか?

「プロジェクトの初期作成のためだけに、わざわざ CLI を PC にインストールするのは面倒だ…」
「たまにしか使わないツールで、自分の開発環境を汚したくない」

Spring Boot CLI は、一度プロジェクトを作ってしまえば、その後の出番はほとんどありません。まさに「その場限り」で使いたいツールです。

この記事では、そんなあなたのための解決策として、コンテナ技術「Docker」を使った方法を提案します。Docker を使えば、あなたの PC には何もインストールせず、完全にクリーンな状態で Spring Boot CLI を実行し、目的のプロジェクトを作成できます。

この記事を読み終えれば、環境を汚すことへのためらいから解放され、必要なツールを必要なときだけスマートに利用するテクニックが身についているはずです。

なぜ Spring Boot CLI のために Docker を?

Spring Boot 開発に慣れている方なら、プロジェクトのセットアップには https://start.spring.io を使うのが一般的でしょう。しかし、コマンドラインで完結させたい、あるいは定型的なプロジェクト作成をスクリプト化したいといった場面では、公式の「Spring Boot CLI」が役立ちます。公式のドキュメントは次の URL で公開されています。

とはいえ、この CLI は基本的にプロジェクトの初期作成時にしか使いません。

そのためだけに SDKMAN!Homebrew を使って CLI をインストールするのは、少し大げさに感じるかもしれません。

この問題をエレガントに解決してくれるのが、現代のITインフラを支えるコア技術の一つ、「Docker」です。

Docker は、アプリケーションの実行環境を「コンテナ」と呼ばれる独立した空間にパッケージングする技術です。これを使うことで、まるで PC の中に、他の場所とは隔離された「使い捨ての作業部屋」を作るようなことができます。

この「作業部屋」としての Docker コンテナには、プログラミング学習者にとって嬉しい次のようなメリットがあります。

  • PC をクリーンに保つ(ポータビリティ)
  • 環境の再現が容易(再現性)
  • 不要になったらすぐ捨てられる(イミュータビリティ)

コンテナ内で必要なツール(今回は Spring Boot CLI)をインストールし、作業が終わればコンテナごと削除するだけ。あなたの PC 本体には、余計なファイルや設定が一切残りません。これにより、PC を常にクリーンな状態に保つことができます。

Docker は Dockerfile という設定ファイルに環境の構成を記述します。このファイルさえあれば、いつでも、どこでも、誰でも、全く同じ環境を寸分違わず再現できます。「自分の PC では動いたのに、他の人の環境では動かない」といった典型的なトラブルを未然に防ぐことができます。

あるツールを試してみて「やっぱり自分には合わなかったな」と感じたとします。Docker なら、そのコンテナを削除するコマンドを一つ実行するだけで、すべてを綺麗さっぱり無かったことにできます。アンインストール方法を調べる手間も、消し残しを心配する必要もありません。

これらのメリットから、Docker は「とりあえず試してみたい」という学習フェーズにおいて、まさに最強の武器となります。環境構築の心理的なハードルを下げ、より本質的なプログラミングの学習に集中させてくれるのです。

「なるほど、だから Docker を最初に学ぶと良いのか!」と感じていただけたでしょうか。

実践!Docker で Spring Boot CLI を動かしてみよう

お待たせしました!いよいよ Docker を使って、Spring Boot CLI のためのクリーンな開発環境を構築します。

今回は、環境構築の具体的な手順を Dockerfilecompose.yaml という 2 つのファイルにまとめておきました。これらのファイルを使えば、誰でも同じ環境をコマンド一つで再現できます。

ここでは次のフォルダ構成でファイルを用意します。

ev-springboot-cli/
├── Dockerfile
├── compose.yaml
└── install-spring-boot-cli.sh

準備するファイル

まずは、作業用のディレクトリ(ここでは dev-springboot-cli)を作成し、その中に先に示した3つのファイルを用意します。

install-spring-boot-cli.sh

これは、Spring Boot CLI をダウンロードし、インストールするためのシェルスクリプトです。

#!/bin/bash

# spring boot cli のバージョン
VERSION=3.5.7

# アーカイブファイル、チェックサムデータファイルの URL
REPO_URL=https://repo.maven.apache.org/maven2
PROJ_SPRING_CLI=org/springframework/boot/spring-boot-cli
FILE=spring-boot-cli-${VERSION}-bin
TAR_URL="${REPO_URL}/${PROJ_SPRING_CLI}/${VERSION}/${FILE}.tar.gz"
SHA1_URL="${REPO_URL}/${PROJ_SPRING_CLI}/${VERSION}/${FILE}.tar.gz.sha1"

# spring ユーザー、spring グループの追加
USER_ID=1000
GROUP_ID=1000
sh -c "groupadd -g ${GROUP_ID} spring"
sh -c "useradd -s /bin/bash -m -u ${USER_ID} -g spring spring"

# ダウンロード
curl -fsSL "${TAR_URL}" -o /tmp/cli.tar.gz
curl -fsSL "${SHA1_URL}" -o /tmp/cli.tar.gz.sha1

# チェックサムファイルの作成とチェック
echo "$(cat /tmp/cli.tar.gz.sha1)  /tmp/cli.tar.gz" \
    > /tmp/cli.tar.gz.sha1.new; \
sha1sum -c /tmp/cli.tar.gz.sha1.new

# 展開
tar -xzf /tmp/cli.tar.gz -C /usr/local/

# 不要ファイルの削除
rm /tmp/cli.tar.gz /tmp/cli.tar.gz.sha1;

# バージョンに関係なくパスを固定するためのシンボリックリンク作成
ln -s \
    "/usr/local/spring-${VERSION}" \
    "/usr/local/spring"

# spring ユーザで作業をしやすくするための設定
cat << EOS >> /home/spring/.bashrc

. /usr/local/spring-${VERSION}/shell-completion/bash/spring

if echo $PATH | grep spring > /dev/null; then
    :
else
    export PATH="${PATH}:/usr/local/spring/bin"
fi
if [ "${JAVA_HOME}" = "" ]; then
    export JAVA_HOME=/opt/java/openjdk
fi
EOS

# ファイル所有権について調整
chown -R 1000:1000 "/usr/local/spring-${VERSION}"

Dockerfile

次に、Docker イメージを構築するための設計図、Dockerfile です。

FROM eclipse-temurin:17-jdk-jammy

COPY ./install-spring-boot-cli.sh /usr/local/bin/install-spring-boot-cli.sh
RUN bash /usr/local/bin/install-spring-boot-cli.sh

USER spring
ENTRYPOINT ["/usr/local/spring/bin/spring"]

このファイルでは、以下のステップで環境を構築しています。

  1. FROM: Java 17 がプリインストールされた eclipse-temurin イメージをベースにします。
  2. COPY: 先ほど作成したインストールスクリプトをコンテナ内にコピーします。
  3. RUN: コピーしたスクリプトを実行して Spring Boot CLI をインストールします。
  4. USER: コマンドを実行するユーザーを spring に切り替えます。
  5. ENTRYPOINT: このコンテナが起動したときに、デフォルトで spring コマンドが実行されるように設定します。

compose.yaml

最後に、Docker コンテナの起動設定を管理する compose.yaml です。このファイルがなくても docker コマンドでイメージビルドはできますが、環境をバージョン管理するためには、こういったファイルを用意しておくほうが良いです。compose.yaml があれば、ここに作成するイメージファイル名を宣言しておけますし、環境変数などを使いたいときにもここへ宣言しておけば良いです。このファイルを Git などのバージョン管理システムで管理することで、環境のバージョン管理ができるようになります。

name: dev-springboot-cli
services:
  dev-springboot-cli:
    build: .
    image: dev-springboot-cli:3.5.7
    container_name: dev-springboot-cli
    tty: true
    hostname: dev-springboot-cli
  • build: .: 同じディレクトリにある Dockerfile を使ってイメージをビルドします。
  • image: ...: ビルドしたイメージに dev-springboot-cli:3.5.7 という名前を付けます。
  • tty: true: コンテナを操作するために、ターミナルを接続したままにします。

実行してみよう

ファイルが準備できたら、ターミナルで compose.yaml があるディレクトリに移動し、以下のコマンドを実行します。

まずは、Dockerfile を基に Docker イメージをビルドします。

docker compose build

ビルドが完了したら、いよいよコンテナを起動して Spring Boot プロジェクトを作成します。以下のコマンドを実行してください。

docker compose run --rm \
  -v $(pwd):/workspace \
  -w /workspace \
  dev-springboot-cli \
  init \
    --type=gradle-project-kotlin \
    --language=java \
    --bootVersion=3.5.7 \
    --name=spring-bellsoft \
    --groupId=internal.dev \
    --artifactId=spring-bellsoft \
    --packageName=internal.dev.spring_bellsoft \
    --dependencies=web \
    --javaVersion=17 \
    spring-bellsoft

少し長いですが、分解してみましょう。

  • docker compose run --rm: コンテナを実行し、処理が終わったら自動でコンテナを削除します(--rm)。
  • -v $(pwd):/workspace: 現在のディレクトリのパス($(pwd))を、コンテナ内の /workspace ディレクトリに接続(マウント)します。これにより、コンテナ内で生成されたファイルが、手元の PC にも反映されます。
  • -w /workspace: コンテナ内での作業ディレクトリを /workspace に指定します。
  • dev-springboot-cli: 実行するコンテナサービスの名前です(compose.yaml で定義)。
  • init ... spring-bellsoft: これ以降が、コンテナ内で実行される spring コマンドの引数です。ここでは、spring-bellsoft という名前で、Web の依存関係を持つ Kotlin 版の Gradle プロジェクトを作成しています。

コマンドが成功すると、現在のディレクトリに spring-bellsoft というフォルダが作成されているはずです。中には Spring Boot プロジェクトのひな形がすべて揃っています。

たったこれだけです! あなたの PC には Java も Spring Boot CLI もインストールされていません。しかし、Docker を通じて、クリーンな環境で目的のプロジェクトを無事に作成できました。

ちなみに、compose.yaml を使わなくても、dev-springboot-cli:3.5.7 イメージのコンテナで spring コマンドを実行することはできます。例えば spring --version を実行するには次のようにします。

docker container run --rm -it \
  -v $(pwd):/workspace \
  -w /workspace \
  dev-springboot-cli:3.5.7 \
  --version

まとめ

この記事では、プログラミング学習の最初の壁である「環境構築」の不安を、Docker を使って解消する方法を紹介しました。

Spring Boot CLI という「たまにしか使わないツール」を例に、Dockerfilecompose.yaml を使って、PC の環境をクリーンに保持したまま、必要なときにだけツールを呼び出す開発スタイルを体験しました。もう、よくわからないコマンドを恐れたり、PC の設定を心配したりする必要はありません。

今回学んだテクニックは、Spring Boot CLI だけにとどまりません。

  • Python の高速なパッケージインストーラーである uv
  • Node.js の効率的なパッケージマネージャー pnpm
  • その他、さまざまな言語の特定のバージョンや、特定のコマンドラインツール

など、あらゆる場面で応用が可能です。「このツール、ちょっと試してみたいな」と思ったら、まずは Docker で使い捨ての環境を作れないか考えてみてください。

このクリーンな開発スタイルを武器に、これからも新しい技術の学習をどんどん楽しんでいきましょう!

Discussion