2016-10-06 13 views
2

Docker 1.12を使用します。なんらかの理由で、Gradle 2.14プロジェクトであるDockerコンテナをビルドすると、fat JARがビルドされ、ローカルに格納されます。問題は、単一の太いJARがDockerイメージに格納されているにもかかわらず、それぞれ約300MBの4つの新しいレイヤーが作成されることです。Docker Gradleプロジェクトは単一のJARを生成しますが、4つのレイヤーを再構築します。

なぜ1つのファイルに非常に多くのスペースが必要かわかりません。このDockerfileを今後どのように最適化すれば、それを防ぐことができますか?

JARをコンテナの外に作成してコピーする必要がありますか?

FROM anapsix/alpine-java:8_jdk 

WORKDIR/

RUN mkdir /build 

COPY . /build 

WORKDIR /build 

RUN mkdir /app 
RUN cp ./lib/machine-learning-models.jar /app/machine-learning-models.jar 

RUN bash gradlew shadowJar 
RUN cp ./build/libs/server-0.1-SNAPSHOT-all.jar /app/server.jar 

WORKDIR/
RUN rm -rf /build 

EXPOSE 8000 

ENTRYPOINT java -cp /app/machine-learning-models.jar:/app/server.jar com.company.Boot 

ありがとうございました!

答えて

1

最高の解決策は、コンテナの外に太いJARを作成して、COPYです。

私の最終的な解決策は、Java JREにバンドルされた裸の骨のDocker Alpineコンテナを使用しています。ビルド時にgradle shadowJarを実行し、JARをコンテナにコピーします。 @ mixjaの応答を1として

FROM anapsix/alpine-java:8_jre

が、それは基本的に "解放" の画像です。

0

Dockerは、各コマンドの新しいレイヤーをDockerfileに作成します。改行をマスキングするために、各行の終わりに

[...] 
WORKDIR /build 

RUN mkdir /app \ 
    && cp ./lib/machine-learning-models.jar /app/machine-learning-models.jar \ 
    && bash gradlew shadowJar \ 
    && cp ./build/libs/server-0.1-SNAPSHOT-all.jar /app/server.jar 

WORKDIR/
[...] 

お知らせ\:これをやってから、ドッカーを防ぐために、あなたはこのようなあなたのRUN-コマンドを集約することができます。

この方法では、DockerはRUNコマンド用に1つのレイヤーしか作成せず、ディスク領域もそれほど必要ありません。詳細については、this answerを参照してください。

+0

興味深いことに、JARファイルが2つの異なるコマンドで区切られていると、ディスク容量が非常に大きくなるのはなぜですか? (根底にある原因) – crockpotveggies

0

JARを個別に(外部または別のビルドイメージ/コンテナでローカルFSにコピーする)作成し、JARファイルを「リリース」イメージにコピーする必要があります(JREではJREを必要としません)単一の操作として。

関連する問題