Java 開発者のための Docker Multi Stage Build の活用方法
Java 開発者のために Docker Multi Stage Build を活用した本番用イメージの作成方法と、監視やデバッグが可能な検証用イメージの同時作成方法についてビデオにまとめました。どうぞご覧ください。
下記のような Multi Stage Build に対応した Dockerfile を作成します。(動画中は少し Dockerfile の書き方が変わっていますが、基本的には下記と同じです。)
# syntax = docker/dockerfile:1.0-experimental ############################################### # Create Runtime Bases Image ############################################### FROM mcr.microsoft.com/java/jre:11u6-zulu-alpine as base RUN apk update \ && apk add tzdata \ && rm -rf /var/cache/apk/* ENV LANG ja_JP.UTF-8 ENV LANGUAGE ja_JP ENV LC_ALL ja_JP.UTF-8 ENV TZ='Asia/Tokyo' ENV APP_HOME /home/java RUN addgroup -g 2000 -S java && adduser -u 2000 -S java -G java USER java WORKDIR $APP_HOME ############################################### # Build Source Code ############################################### FROM maven:3.6.3-jdk-11-slim as BUILD #FROM mcr.microsoft.com/java/maven: as BUILD WORKDIR /build COPY pom.xml . COPY src/ /build/src/ ## Maven のローカル・レポジトリをキャッシュ RUN --mount=type=cache,target=/root/.m2 \ mvn clean package ############################################### # Create Final Image ############################################### FROM base as final COPY --from=BUILD /build/target/sample-java-app-0.0.1-SNAPSHOT.jar /home/java/app.jar ENTRYPOINT ["java", "-jar", "/home/java/app.jar"] EXPOSE 8080 ############################################### # Create Debuggable Monitorable Image ############################################### FROM base as debug COPY --from=BUILD /build/target/sample-java-app-0.0.1-SNAPSHOT.jar /home/java/app.jar ENTRYPOINT ["java", "-Xdebug", "-Xrunjdwp:server=y,transport=dt_socket,address=*:5050,suspend=n", "-Dcom.sun.management.jmxremote.local.only=false", "-Djava.rmi.server.hostname=127.0.0.1", "-Dcom.sun.management.jmxremote", "-Dcom.sun.management.jmxremote.port=18686", "-Dcom.sun.management.jmxremote.rmi.port=18686", "-Dcom.sun.management.jmxremote.authenticate=false", "-Dcom.sun.management.jmxremote.ssl=false", "-jar", "/home/java/app.jar"] EXPOSE 8080 5050 18686
上記の Dockerfile を元にイメージを作成する際、それぞれ下記のようにターゲットを指定してビルドを行ってください。
本番用イメージの作成 (–target=final)
$ docker build -t tyoshio2002/spring-sample:1.0 . --target=final $ docker run -p 8080:8080 -it tyoshio2002/spring-sample:1.0
検証環境イメージの作成と起動 (–target=debug)
$ docker build -t tyoshio2002/spring-sample-debug:1.0 . --target=debug $ docker run -p 8080:8080 -p 5050:5050 -p 18686:18686 -it tyoshio2002/spring-sample-debug:1.0
その他の特記事項
上記の Dockerfile は先頭行に # syntax = docker/dockerfile:1.0-experimental と記載しています。これを記述すると Docker の Exprimental の機能 (BuildKit) が利用できるようになります。これによりビルド処理を並列で実行できるようになるほか、Dockerfile 中の下記の行のように、Multi-stage Build で Maven のローカル・レポジトリをキャッシュできるようになります。
RUN --mount=type=cache,target=/root/.m2 \ mvn clean package
より詳しく説明すると、今まではマルチステージ・ビルド中では、Maven のローカル・レポジトリをキャッシュできなかったため、ビルドの度に毎回大量の依存ライブラリをパブリック・レポジトリからダウンロードしなければなりませんでしたが、この–mount=type=cacheで毎回のダウンロードは不要になります。
こうした Docker の新しい機能もどうぞご活用ください。
Entry filed under: Java.