かんがるーさんの日記

最近自分が興味をもったものを調べた時の手順等を書いています。今は Spring Boot をいじっています。

Spring Boot 2.1.x の Web アプリを 2.2.x へバージョンアップする ( その14 )( Docker で複数の Tomcat を起動して動作確認する )

概要

記事一覧はこちらです。

Spring Boot 2.1.x の Web アプリを 2.2.x へバージョンアップする ( その13 )( gradle の VM オプションを gradle.proeprties に移行する+spring.main.lazy-initialization を試してみる2 ) の続きです。

  • 今回の手順で確認できるのは以下の内容です。
    • jar ファイルを作成して動作確認します。
    • Tomcat の起動はサービスからではなく docker-compose.app.yml を使用して行います。
    • docker-compose.app.yml から起動するコンテナの docker image は最新版にバージョンアップします。

参照したサイト・書籍

目次

  1. docker-compose.app.yml で起動するコンテナの docker image をバージョンアップする
  2. Docker で複数の Tomcat を起動して動作確認する

手順

docker-compose.app.yml で起動するコンテナの docker image をバージョンアップする

docker-compose up -d コマンドを実行した後、build タスクを実行して jar ファイルを作成します。

f:id:ksby:20200113172634p:plain

docker-compose.app.yml の以下の点を変更します。

services:
  app:
    build:
      context: .
      dockerfile: docker/app/Dockerfile
    image: ksbysample-webapp-lending
    volumes:
      - ./build/libs/ksbysample-webapp-lending-2.2.2-RELEASE.jar:/app.jar
      - ./docker/app/docker-entrypoint.sh:/usr/local/bin/docker-entrypoint.sh
    environment:
      - SPRING_DATASOURCE_HIKARI_JDBC_URL=jdbc:postgresql://postgresql/ksbylending
      - SPRING_MAIL_HOST=mail-server
      - SPRING_RABBITMQ_HOST=haproxy
    deploy:
      mode: replicated
      replicas: 3
    # entrypoint: /bin/sh
    # stdin_open: true
    # tty: true

  haproxy-app:
    image: haproxy:2.1.2-alpine
    container_name: haproxy-app
    volumes:
      - ./docker/app/haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg:ro
    ports:
      - "8080:8080"
    depends_on:
      - app
  haproxy-app-rsyslog:
    image: rafpe/docker-haproxy-rsyslog:latest
    container_name: haproxy-app-rsyslog
    volumes:
      - ./docker/app/haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg:ro
    depends_on:
      - haproxy-app
  • app コンテナの記述で - ./build/libs/ksbysample-webapp-lending-2.1.3-RELEASE.jar:/app.jar- ./build/libs/ksbysample-webapp-lending-2.2.2-RELEASE.jar:/app.jar に変更します。
  • haproxy-app コンテナの記述で image: haproxy:1.8.14-alpineimage: haproxy:2.1.2-alpine に変更します。
  • haproxy-app-rsyslog コンテナの記述で image: rafpe/docker-haproxy-rsyslogimage: rafpe/docker-haproxy-rsyslog:latest に変更します。

docker/app/Dockerfile の以下の点を変更します。

FROM adoptopenjdk/openjdk11:jdk-11.0.5_10-alpine-slim
RUN apk add --no-cache tzdata
ENV TZ="Asia/Tokyo"
ENV LANG="ja_JP.UTF-8"
VOLUME /tmp
EXPOSE 8080
ENTRYPOINT ["docker-entrypoint.sh"]
  • FROM adoptopenjdk/openjdk11:jdk-11.0.2.9-alpine-slimFROM adoptopenjdk/openjdk11:jdk-11.0.5_10-alpine-slim に変更します。

IntelliJ IDEA の Service Tool Window から docker の ksbysample-webapp-lending:latest の image を削除した後、docker-compose -f docker-compose.app.yml --compatibility build --no-cache コマンドを実行して image を作り直します。。。が、docker/prometheus/storage の下のファイルを参照できず PermissionError が発生しました。

f:id:ksby:20200113174927p:plain

プロジェクトのルートディレクトリ直下に .dockerignore ファイルを作成して以下の内容を記述し、build 時に参照しないようにします。

docker/prometheus/storage/*

再度 docker-compose -f docker-compose.app.yml --compatibility build --no-cache コマンドを実行すると、今度は成功しました。

f:id:ksby:20200113175739p:plain

IntelliJ IDEA の Service Tool Window から不要になった以下の docker image を削除します。

  • adoptopenjdk/openjdk11:jdk-11.0.2.9-alpine-slim

Docker で複数の Tomcat を起動して動作確認する

docker-compose -f docker-compose.app.yml --compatibility up -ddocker-compose -f docker-compose.mail.yml up -d コマンドを実行します。

f:id:ksby:20200113180336p:plain

http://localhost:8080/haproxy?stats にアクセスして全てのインスタンスが緑色になるまで待ちます。。。が、いつまで経っても緑色になりませんでした。

f:id:ksby:20200113180742p:plain

IntelliJ IDEA の Service Tool Window で app コンテナを見ると ... org.springframework.boot.context.properties.bind.BindException: Failed to bind properties under 'server.tomcat.basedir' to java.io.File エラーメッセージが出て落ちていました。

f:id:ksby:20200113180848p:plain

Docker で起動する時は product profile で起動しており、server.tomcat.basedir は application-product.properties では以下のように定義しています。起動しなくて当然でした。以前はよくこれで起動していましたね。。。

server.tomcat.basedir=D:/webapps/ksbysample-webapp-lending
logging.file.name=${server.tomcat.basedir}/logs/ksbysample-webapp-lending.log

spring.autoconfigure.exclude=com.integralblue.log4jdbc.spring.Log4jdbcAutoConfiguration

valueshelper.classpath.prefix=BOOT-INF.classes.

docker-compose -f docker-compose.app.yml --compatibility down コマンドを実行して app コンテナを終了させた後、docker/app/docker-entrypoint.sh の以下の点を変更します。

#!/bin/sh
# 改行コードを LF にすること。LF でないと実行されない。

export JAVA_OPTS="-Xms1024m -Xmx1024m -XX:MaxMetaspaceSize=384m"

exec java $JAVA_OPTS \
          -Djava.security.egd=file:/dev/./urandom \
          -Dspring.profiles.active=product \
          -Dserver.tomcat.basedir=/ \
          -Dlogging.appender=CONSOLE \
          -jar /app.jar
  • -Dserver.tomcat.basedir=/ \ を追加します。

再び docker-compose -f docker-compose.app.yml --compatibility up -d コマンドを実行した後、http://localhost:8080/haproxy?stats にアクセスして全てのインスタンスが緑色になるまで待つと今度は緑色になりました。

f:id:ksby:20200113182101p:plain

以下の手順で動作確認します ( 画面キャプチャは省略します )。

  • ブラウザを起動して http://localhost:8080/ にアクセスしてログイン画面を表示します。tanaka.taro@sample.com / taro でログインします。
  • 検索対象図書館登録画面が表示されます。"東京都" で検索した後、一覧表示されている図書館から「国立国会図書館東京本館」を選択します。
  • ログアウトします。
  • ログイン画面に戻るので suzuki.hanako@test.co.jp / hanako でログインします。
  • 貸出希望書籍 CSV ファイルアップロード画面が表示されます。以下の内容が記述された CSV ファイルをアップロードします。

    "ISBN","書名"
    "978-4-7741-6366-6","GitHub実践入門"
    "978-4-7741-5377-3","JUnit実践入門"
    "978-4-7973-8014-9","Java最強リファレンス"
    "978-4-7973-4778-4","アジャイルソフトウェア開発の奥義"
    "978-4-87311-704-1","Javaによる関数型プログラミング"

  • 「貸出状況を確認しました」のメールが送信されるので、メールに記述されている URL にアクセスします。
  • 貸出申請画面が表示されます。3冊程「申請する」を選択して申請します。
  • ログアウトします。
  • 「貸出申請がありました」のメールが送信されるので、メールに記述されている URL にアクセスします。ログイン画面が表示されるので、tanaka.taro@sample.com / taro でログインします。
  • 貸出承認画面が表示されます。「承認」あるいは「却下」を選択して確定させます。
  • ログアウトします。
  • 「貸出申請が承認・却下されました」のメールが送信されるので、メールに記述されている URL にアクセスします。ログイン画面が表示されるので、suzuki.hanako@test.co.jp / hanako でログインします。
  • 貸出申請結果確認画面が表示されるので内容を確認します。

動作確認は特に問題ありませんでした。

docker-compose -f docker-compose.app.yml --compatibility downdocker-compose -f docker-compose.mail.yml downdocker-compose down コマンドを実行してコンテナを停止します。

履歴

2020/01/13
初版発行。