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.
