今更ながらDockerのマルチステージビルドについて学んでみる

2023年6月5日

前回のSelenideで行ったブラウザ操作を自動化する際のイメージを作成する際にマルチステージビルドを使用したので、その手順を記載していこうと思う。(今更だけど・・・)

マルチステージビルドとは

マルチステージビルドは、Docker 17.05 またはそれ以上の Docker デーモンおよび Docker クライアントにおける新機能です。 マルチステージビルドは、Dockerfile を読みやすく保守しやすくするように、最適化に取り組むユーザーにとって非常にありがたいものです。(公式より)

以前まではアプリ用のDockerイメージをビルドする。ビルドした成果物をdocker create等を使用して、もう一つの軽量化されたDockerイメージにコピーするようにするshellを作成していた。二つのイメージを保守していたが、マルチステージビルドを行うことによって、軽量イメージを一つのDockerfileから作成することができるらしいです。

マルチステージビルドを使う

マルチステージビルドを使うには、Dockerfile内でFROM句を複数記載します。アプリ用のビルドイメージのFROM句を記載して、そこから軽量イメージのFROM句に対してコピーを行う形式で記載します。以下のような感じです。

# アプリビルド用のイメージ
FROM gradle:jdk8-alpine
‥‥‥
# ビルドコマンド
RUN /bin/sh -c gradle clean build
‥‥‥
# 軽量イメージ
FROM alpine:latest
# アプリビルド用のイメージから軽量イメージにビルドした成果物をコピーする
COPY --from=0 /work/build/libs /work
‥‥‥
# 実行するコマンド
CMD ["java","-jar","selenide-sample.jar"]

これで一つのファイルで簡潔に書くことができます。

ビルドステージの命名

先程はCOPY --from=0 のように直前のステージを指定することでコピーしましたが、FROM句にAS <NAME>をつけることでCOPY --from=<NAME>のように別名のイメージからコピーをすることができます。

# アプリビルド用のイメージ
FROM gradle:jdk8-alpine as gradlebuild
‥‥‥
# ビルドコマンド
RUN /bin/sh -c gradle clean build
‥‥‥
# 軽量イメージ
FROM alpine:latest
# アプリビルド用のイメージから軽量イメージにビルドした成果物をコピーする
COPY --from=gradlebuild /work/build/libs /work
‥‥‥
# 実行するコマンド
CMD ["java","-jar","selenide-sample.jar"]

ビルドステージの指定

target <NAME>を指定することで特定のステージのみビルドすることができます。

$ docker build --target gradlebuild -t sample/sample-gradle-build:1.0.0 .

最終的なイメージ

最終的なDockerfileは以下になります。

# アプリビルド用のイメージ
FROM gradle:jdk8-alpine as gradlebuild

ADD --chown=gradle:gradle . /work
WORKDIR /work
# ビルドコマンド
RUN /bin/sh -c gradle clean build

# 軽量イメージ
FROM alpine:edge
# フォルダを作って jar をコピー
RUN mkdir -p /work
# アプリビルド用のイメージから軽量イメージにビルドした成果物をコピーする
COPY --from=gradlebuild /work/build/libs /work
# 必要事項のダウンロード
RUN apk add --update \
              udev \
              ttf-freefont \
              chromium \
              chromium-chromedriver \
              openjdk8

WORKDIR /work
CMD ["java","-jar","selenide-sample.jar"]

ビルドして、実行します。

$ docker build -t ******/sample-selenide:1.0.0 .
$ docker run ******/sample-selenide:1.0.0
ウェブ検索結果
上田晋也 - Wikipedia
https://ja.wikipedia.org › wiki › 上田晋也
上田 晋也(うえだ しんや、1970年(昭和45年)5月7日 - )は日本のお笑いタレント、司会者、キャスター、俳優。お笑いコンビ・くりぃむしちゅーのツッコミ担当。相方は有田哲平。 熊本県熊本市南区出身。プライムを経て、ナチュラルエイト所属。身長172cm、 ...
最終学歴: 熊本県立済々黌高等学校卒業 コンビ名: くりぃむしちゅー
相方: 有田哲平 事務所: プライム→ナチュラルエイト
上田晋也のサタデージャーナル · 有田哲平 · 上田啓介 · おしゃれイズム%

これで自動化するためのDockerイメージの作成が完了しました。次回はこれをcron jobにして、定期的に実行できるようにしてきたいと思います。