今更ながらDockerのマルチステージビルドについて学んでみる
前回の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にして、定期的に実行できるようにしてきたいと思います。