🐳

Dockerコンテナ上でSpring Bootアプリケーションのビルド

2022/10/09に公開

Dockerコンテナ上でSpring Bootアプリケーションのビルド

GitHubで管理しているSpring BootアプリケーションのソースコードをAWS CodeBuildでビルドする環境を構築しますが、その事前準備としてAmazon Linux2をOSにしたDockerコンテナ上でビルドを実行していきます。

CodeBuildはサーバーレスアーキテクチャであるため、以下の処理等が毎回行われ、ビルドに時間がかかります。

  • Containerの取得
  • yum update
  • mvn package時の各種ライブラリのダウンロード

そのため、トライアンドエラーで試行錯誤する際に時間がかかってしまうために、事前にサーバーレスでない環境で動作確認することをお勧めします。
Dockerが使えない方はAmazon Linux2のEC2上での確認でも問題ありません。

以下、Dockerコンテナ上でSpring Bootアプリケーションのビルドを行います。

前提条件

Dockerが使える環境は用意されているものとして、以下、説明を進めます。

私はDocker DesktopをMacにインストールして利用していますが、企業の利用については条件次第で有料となったため注意ください。(2022年10月時点の情報)

ここでは、MacにDocker Desktopをインストールして、ターミナルから各種コマンドを実行することを前提に説明します。
そのため、rootユーザでのコマンド実行を前提としています。
EC2上で行う場合は適宜sudosuが必要となるためご注意ください。

Dockerコンテナの起動

Macのターミナルを起動します。
以下のコマンドを実行して、Amazon Linux2のDockerコンテナを構築します。

# Dockerイメージの取得(Amazon Linux2)
docker pull amazonlinux:2
docker images

# Dockerコンテナの起動
docker run -d -it --name spring-boot-demo-container amazonlinux:2 /bin/bash

# コンテナの確認(ここで表示されれば問題なく起動されている)
docker ps

docker run ではコンテナ起動後に、ログインしてコンソールからコマンドを入力するために、-d-itオプションをつけて起動します。

Dockerコンテナ上のOSの基本設定

Dockerコンテナにログイン

# Dockerコンテナにログイン
docker exec -it spring-boot-demo-container bash

以下からはDockerコンテナ内でのコマンド実行です。
最低限の設定やパッケージの最新化を行なっています。
rootユーザでログインしているので、sudoは不要です。

whichコマンドのインストールは必須ではありませんが、このあと各コマンドをインストールしていくので、どのパスにインストールされているのか確認するためにあると便利です。

# ログインユーザの確認
id

# OS情報の確認
cat /etc/system-release
cat /etc/os-release

# 各種パッケージの最新化
yum update -y

# タイムゾーンの変更
# UTCになっている
date
# タイムゾーンの変更
cp /usr/share/zoneinfo/Japan /etc/localtime
# JSTに変更され、日本の時間が出力されることを確認
date

# whichコマンドのインストール
yum install -y which

Java17のインストール

JavaはAmazon Correttoをインストールします。
Amazonでの稼働実績も豊富で、無料で使用でき、本番環境でも問題なく使用できる信頼できるディストリビューションだと思います。
バージョンは現時点で最新のLTS(長期サポート)である17をインストールします。

# JDKのインストール
yum install -y java-17-amazon-corretto
java -version

# JDKのデフォルトを設定(この環境では不要であるが、CodeBuild構築時に必要となるため念の為設定しておく)
/usr/sbin/alternatives --config java
# > 1(java-17-amazon-corretto)を入力
# ※複数JDKが入っている場合はjava-17-amazon-correttoの番号を入力

# JAVA_HOMEの設定
cd /etc/profile.d
echo '#!/bin/sh' > java.sh
echo 'export JAVA_HOME=/usr/lib/jvm/java-17-amazon-corretto.aarch64' >> java.sh
chmod 644 java.sh

# 本来、再度ログインすると上記シェルが実行され、環境変数が設定されるが、
# Dockerコンテナの場合、ログイン時に実行されないため、手動で読み込み
source /etc/profile

# 確認
echo $JAVA_HOME

Apache Mavenのインストール

Apache Mavenをインストールします。
wgetでインストールパッケージをDLするので、wgetを事前にインストールしています。

# wgetのインストール
yum install -y wget
wget --version

# mavenのインストール
wget https://repos.fedorapeople.org/repos/dchen/apache-maven/epel-apache-maven.repo -O /etc/yum.repos.d/epel-apache-maven.repo
sed -i s/\$releasever/7/g /etc/yum.repos.d/epel-apache-maven.repo
sed -i s/\$basearch/x86_64/g /etc/yum.repos.d/epel-apache-maven.repo
yum install -y apache-maven
mvn -version

Gitのインストールと設定

SSH鍵の生成

gitをインストールします。
次にDockerコンテナ上のLinuxで公開鍵と秘密鍵を生成します。
この後の手順で生成した公開鍵をGitHubに登録して、GitHubと通信できるようにします。

# gitのインストール
yum install -y git
git version

# SSH認証キー生成
cd ~
ssh-keygen -t rsa
# デフォルトのままで問題ないため、Enterを3回押す

# キーが生成されていることを確認
ls -l .ssh

# 公開鍵を確認(この後、GitHubに登録)
cat ~/.ssh/id_rsa.pub

GitHubに公開鍵を登録

GitHubの画面から上記で生成した鍵情報を登録します。

  • GitHubにログイン
  • 右上のアカウントアイコンをクリックして、Settingsを選択
  • 左のメニューからSSH and GPG keysをクリック
  • New SSH keyボタンをクリック
  • Keyを追加
    • Titleには適当な名称を入力
    • Key typeはAuthentication Keyを選択
    • Key欄に上記のcatコマンドで確認したid_rsa.pubの文字列を公開鍵として貼り付ける
    • Add SSH keyボタンを押す

GitHubからソースコードの取得

Dockerコンテナにログインして以下のコマンドを実行します。

mkdir ~/app
cd ~/app
git clone git@github.com:ryotsuka7/spring-boot-demo
# 初回のみ「Are you sure you want to continue connecting (yes/no)?」
# と聞かれるので、「yes」と入力してEnterキーを押す

# 確認(spring-boot-demoディレクトリができていることを確認)
ls -l

Spring Bootアプリケーションのビルド

ソースをGitHubからダウンロード出来たら、いよいよビルドします。
Spring Bootではmvn packageで実行可能jarファイルが生成されるようにpom.xmlファイルがデフォルトで構成されていますので、コマンドを実行するだけです。

必要なライブラリをダウンロードするため、結構時間がかかるかと思います。
CodeBuildではこの処理を毎回実行するために実行時間が長くなります。

cd spring-boot-demo
mvn clean package
ls -l target
# spring-boot-demo-0.0.1-SNAPSHOT.jar が生成されていることを確認

Spring Bootアプリケーションの動作確認

ビルドが成功したら、アプリケーションを起動していみます。

java -jar target/spring-boot-demo-0.0.1-SNAPSHOT.jar

別ターミナルを起動して、Dockerコンテナにログインして、curlコマンドでGetリクエストを発行してみます。

docker exec -it spring-boot-demo-container bash
curl localhost:8080/hello

以下のJSONが出力されれば、動作確認成功です。

{"id":100,"name":"taro"}

まとめ

ここまででCodeBuild環境を構築する事前準備は完了です。
結構大変で、ハマるポイントもあるかと思いますが、実環境上で確認しておくとこのあとのCodeBuildの構築は確実に効率的になるかと思いますので、ぜひ試してみてください。

記事一覧

第一回 Spring Bootを使ったWebAPIの作成

第二回 IntelliJ IDEAを使って、Spring BootプロジェクトをGitHubにPush

第三回 Dockerコンテナ上でSpring Bootアプリケーションのビルド

第四回 AWS CodeBuildでSpring Bootアプリケーションをビルド

第五回 AWS CodeDeployでSpring Bootアプリケーションのデプロイ

第六回 CodePipelineでSpring BootアプリをCI/CD

Discussion