Dockerコンテナ上でSpring Bootアプリケーションのビルド
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上で行う場合は適宜sudo
やsu
が必要となるためご注意ください。
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の構築は確実に効率的になるかと思いますので、ぜひ試してみてください。
記事一覧
第二回 IntelliJ IDEAを使って、Spring BootプロジェクトをGitHubにPush
第三回 Dockerコンテナ上でSpring Bootアプリケーションのビルド
第四回 AWS CodeBuildでSpring Bootアプリケーションをビルド
Discussion