1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Spring Boot +Docker 環境改善

Posted at

Spring Boot + Docker環境の問題を改善してみる

前回の記事では、とりあえず動く状態のバックエンド環境を構築しましたが、
実際に使ってみると、いくつか不便に感じる点がありました。

そこで今回は、前回の記事で挙げた課題を改善しながら、
より快適に開発できる環境を目指して取り組んだ内容をまとめました。

Docker や Spring Boot にはまだ不慣れな部分もありますが、
今後の自分が見返せるように、備忘録として記録しておきます。


🧩 今回対応した課題

  • Javaコードの修正を反映させるたびに毎回ビルドが必要
  • ログが見づらく、Docker が正しく起動しているか分かりにくい
  • コンテナ起動時にエラーが発生すると再起動ループに陥る

🔄 対応内容まとめ

✅ 1. Spring DevTools によるホットリロード対応

まず、Javaコードを修正するたびに手動でビルドしなければならない点を改善しました。
以下の記事を参考に、ホットリロードが効くように設定を行いました。

使用した依存関係

build.gradle
dependencies {
    developmentOnly 'org.springframework.boot:spring-boot-devtools'
}

application.properties の追記

デバッグモードではデフォルトで有効らしいですが、明示的に以下を追記しておきます。

application.properties
spring.devtools.restart.enabled=true

✅ 2. Dockerfile の修正

ホットリロードの効果を Docker 環境でも活かすために、Dockerfile を以下のように修正しました。

Dockerfile
FROM openjdk:17-jdk-slim

# 作業ディレクトリ作成
WORKDIR /app

# ビルド関連ファイルを先にコピーして依存取得
COPY build.gradle settings.gradle gradlew /app/
COPY gradle /app/gradle

# 依存だけ先にダウンロードしてキャッシュを効かせる
RUN ./gradlew build --no-daemon || return 0

# アプリケーションのソースコードを追加
COPY . /app

# DevTools を有効にして Spring Boot 起動
CMD ["./gradlew", "bootRun", "--no-daemon"]

✅ 3. docker-compose.yml の修正

docker-compose.yml
services:
  backend:
    build:
      context: ./backend
      dockerfile: Dockerfile
    ports:
      - "8080:8080"
    volumes:
      - ./backend:/app  # ホストのソースコードをマウントして即時反映
      - ~/.gradle:/home/gradle/.gradle  # Gradle のキャッシュ共有(ビルド高速化)
    environment:
      - SPRING_DEVTOOLS_REMOTE_SECRET=secret
      - SPRING_OUTPUT_ANSI_ENABLED=ALWAYS
    depends_on:
      - db
    restart: "no"  # 起動失敗時に再起動を抑止

📌 volumes を活用することで、ホスト側のコード変更が即コンテナに反映されるようになりました。


✅ 4. 起動成功ログの明示

Docker が起動したかどうか分かりにくいという課題に対し、
Spring Boot アプリが正常に起動したタイミングでログを出力するようにしました。

StartupLogger
package com.example.backend.config;

import jakarta.annotation.PostConstruct;
import org.springframework.stereotype.Component;

@Component
public class StartupLogger {

    @PostConstruct
    public void logStartupMessage() {
        System.out.println("✅ Spring Boot アプリが正常に起動しました");
    }
}

📢 これにより、起動成功が一目で分かるようになりました。


✅ 5. application.properties のログ設定

ログが多すぎて起動成功かどうかが見えにくかったので、最低限のログが出るように調整しました。

# ログレベル調整
logging.level.root=ERROR
logging.level.org.springframework.boot=INFO
logging.level.org.hibernate=ERROR

📉 不要なログを抑えることで、必要な情報が見やすくなりました。


✅ 6. 再起動ループの防止

アプリケーション起動に失敗したとき、Docker コンテナが自動で再起動してしまい、
原因のログが流れてしまうケースがありました。

そこで開発中は以下のようにして、再起動を防止するようにしました。

restart: "no"

💥 改善後の開発体験

Before After
Java ファイル修正ごとにビルドが必要 自動で再起動され、すぐ反映される!
ログが大量で起動状況が分からない 起動成功ログが明示的で分かりやすい
再起動ループでログが追えない 再起動抑止により原因が特定しやすく

🎯 最後に

ここまで読んでいただき、ありがとうございました!

前回は「とりあえず動く環境」を作ることが目的でしたが、
今回は「快適に開発できる環境」を目指して改善を行いました。

特にホットリロードとログ周りの改善によって、開発効率がだいぶ上がったと感じています。
とはいえ、まだ理想の環境とは言えないので、今後も少しずつ整えていけたらと思います。


次回は、フロントエンド環境の構築CI/CDの導入などにも
チャレンジしていきたいと考えています。

ご意見・ご感想などありましたら、コメントでぜひ教えてください 🙌

1
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
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?