Archive for 2020年5月11日

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 の新しい機能もどうぞご活用ください。

2020年5月11日 at 6:31 午後


Java Champion & Evangelist

Translate

ご注意

このエントリは個人の見解であり、所属する会社の公式見解ではありません

カレンダー

2020年5月
 123
45678910
11121314151617
18192021222324
25262728293031

カテゴリー

Twitter

  • RT @rorypreddy: Azure Storage Rules now in Preview!! 𝐚𝐳 𝐬𝐭𝐨𝐫𝐚𝐠𝐞 𝐚𝐜𝐜𝐨𝐮𝐧𝐭 𝐮𝐩𝐝𝐚𝐭𝐞 --𝐫𝐞𝐬𝐨𝐮𝐫𝐜𝐞-𝐠𝐫𝐨𝐮𝐩 "𝐫𝐞𝐬𝐨𝐮𝐫𝐜𝐞𝐠𝐫𝐨𝐮𝐩" --𝐧𝐚𝐦𝐞 "𝐬𝐭𝐨𝐫𝐚𝐠𝐞𝐚𝐜𝐜𝐨𝐮𝐧𝐭" --… 10 hours ago
  • 今見たら雲がいっぱいになってた。運が良かっただけかも。 1 day ago
  • まだ、日が完全に落ちていないからなのか、満月に近い?からなのか、関東の今日の夜空がとても綺麗。 1 day ago
  • RT @sKriemhild: we just updated our Spring Cloud workshop to the new Spring Boot version 2.4.2 🥳 @juliendubois @rorypreddy @yoshioterada @… 2 days ago
  • 今日はJJUGナイトセミナーで久しぶりに、GlassFishについてお話をさせて頂きました! Sun時代や同僚との思い出、GlassFishの歴史等と共に、最新のJakarta EEに関する最新情報をデモを交えながらお届けしました… twitter.com/i/web/status/1… 2 days ago

clustermap

ブログ統計情報

  • 1,203,599 hits

RSSフィード

アーカイブ