🎍
SpringBootにおけるホットデプロイとバインドマウントの関係と書き方について。
はじめに
- SpringBoot初学者です。
- Dockerを使って環境構築をしていました。
- 毎度、
docker compose build
をしないと、変更点が変更されないことに気づき、
ホットデプロイ機能を加えることで、その問題を解決できることを知りました。 - 同時にバインドマウントについても知ったので、自分用のメモとしてまとめます。
開発環境
- macOS
- Java17(maven)
- SpringBoot3.4.1
- postgresSQL
- Docker27.4.0
ホットデプロイとは
- アプリを再起動せずに、コードの変更を反映させる仕組みのこと。
- つまり、再起動する手間を省くことができます。
- ホットデプロイを行うためには、次に記載するマウントの機能がほぼ必須になります。
マウントとは
- 自分のPCのファイルやフォルダをDocker内のコンテナにも共有すること。
ボリュームマウント
- docker engineの管理下に
volume
を確保してそこにファイルを管理します。
バインドマウント
- デスクトップやドキュメントなど、
docker engineの管理していない部分のファイルをマウントすること。 - 直接ファイルを書き換えることができるため、
ソースコードを書き換えながら挙動を確認することができる。
どちらを使うべきか。
- 挙動を確認しながら開発を行いたい場合は、
バインドマウントを使うのがおすすめ。 - この記事では、バインドマウントでコードを書いていきます。
コードの変更点
- SpringBootでプロジェクトを作成し終えたところから、
コードを書き換えていきます。 - ホットリロードのための記載は、
pom.xml
,docker-compose.yml
,Dockerfile
,application.yml
を書き換えていきます。
pom.xml
<!-- spring-boot-devtoolsを追加。 -->
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
docker-compose.yml
<!-- バインドボリュームの処理を追加。 -->
services:
app:
volumes:
- ./src:/app/src
- ./target/classes:/app/target/classes
- ./pom.xml:/app/pom.xml
Dockerfile
FROM maven:3.8-openjdk-17 AS builder
WORKDIR /app
COPY ./pom.xml ./pom.xml
COPY ./src ./src
<!-- Spring DevTools を有効化する環境変数を設定しています。-->
<!-- このオプションにより、コード変更を監視し、自動的にアプリケーションを再起動します。 -->
ENV JAVA_OPTS="-Dspring.devtools.restart.enabled=true"
<!-- そのままコードを実行するため、開発中のコード変更を即座に反映できます。 -->
CMD ["mvn", "spring-boot:run"]
application.yml
<!-- springboot再スタートするための処理をtrueにします。 -->
spring:
devtools:
restart:
enabled: true
最後に
- 以上のようにコードを書き換えることで、
SpringBootのDockerを使ったホットデプロイを実装することができました。 - 初学者ですので間違い等あれば教えてください。
参考文献
Discussion