1. ホーム
  2. java

[解決済み] mavenプロジェクトをdockerizeする方法と、それを達成するための方法を教えてください。

2022-06-19 14:52:02

質問

私はDockerの初心者で、多くのドキュメントを読み、多くの方法を試しましたが、mavenでjavaプロジェクトを実行する方法がわかりません。

  1. を使用してイメージを構築する必要があります。 Dockerfile ?
  2. を指定したホストでmavenプロジェクトを実行する場合、コマンドはどのようになりますか? Dockerfile ?

どのように解決するのですか?

動作例です。

これはspring bootのチュートリアルではありません。Dockerコンテナ内でMavenビルドを実行する方法についての質問に対する、更新された回答です。

質問はもともと4年前に投稿されたものです。

1. アプリケーションを生成する

Springイニシャライザーを使って、デモアプリを生成します。

https://start.spring.io/

zip アーカイブをローカルに展開します。

2. Dockerfileを作成する

#
# Build stage
#
FROM maven:3.6.0-jdk-11-slim AS build
COPY src /home/app/src
COPY pom.xml /home/app
RUN mvn -f /home/app/pom.xml clean package

#
# Package stage
#
FROM openjdk:11-jre-slim
COPY --from=build /home/app/target/demo-0.0.1-SNAPSHOT.jar /usr/local/lib/demo.jar
EXPOSE 8080
ENTRYPOINT ["java","-jar","/usr/local/lib/demo.jar"]

  • この例では 多段階ビルド . 最初のステージはコードをビルドするために使用されます。第2ステージはビルドされたjarとそれを実行するJREのみを含みます(jarがステージ間でどのようにコピーされるかに注意してください)。

3. イメージのビルド

docker build -t demo .

4. 画像を実行する

$ docker run --rm -it demo:latest

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v2.1.3.RELEASE)

2019-02-22 17:18:57.835  INFO 1 --- [           main] com.example.demo.DemoApplication         : Starting DemoApplication v0.0.1-SNAPSHOT on f4e67677c9a9 with PID 1 (/usr/local/bin/demo.jar started by root in /)
2019-02-22 17:18:57.837  INFO 1 --- [           main] com.example.demo.DemoApplication         : No active profile set, falling back to default profiles: default
2019-02-22 17:18:58.294  INFO 1 --- [           main] com.example.demo.DemoApplication         : Started DemoApplication in 0.711 seconds (JVM running for 1.035)

その他

Mavenビルドを最適化し、ローカルリポジトリを使用してjarをキャッシュする方法について、Docker hubのドキュメントをお読みください。

更新情報 (2019-02-07)

この質問は現在4年前のもので、その間にDockerを使用したアプリケーションの構築は大きな変化を遂げたと言うのが正しいでしょう。

オプション 1: 多段階のビルド

この新しいスタイルでは、ビルドツールやソースコードをカプセル化しない、より軽量なイメージを作成することができます。

ここでの例では、再び 公式の Maven のベースイメージを使用して、希望するバージョンの Maven を使用してビルドの第一段階を実行します。ファイルの後半では、ビルドされた jar が最終的な出力イメージにどのように組み立てられるかを定義しています。

FROM maven:3.5-jdk-8 AS build  
COPY src /usr/src/app/src  
COPY pom.xml /usr/src/app  
RUN mvn -f /usr/src/app/pom.xml clean package

FROM gcr.io/distroless/java  
COPY --from=build /usr/src/app/target/helloworld-1.0.0-SNAPSHOT.jar /usr/app/helloworld-1.0.0-SNAPSHOT.jar  
EXPOSE 8080  
ENTRYPOINT ["java","-jar","/usr/app/helloworld-1.0.0-SNAPSHOT.jar"]  

注意

  • 私は、Googleの ディストリビューションレス ベースイメージを使用しています。これは、Java アプリに必要なだけのランタイムを提供するように努めています。

オプション 2: Jib

私はこの方法を使ったことがありませんが、Dockerfile のような厄介なものを作成することなくイメージをビルドできるので、調査に値すると思われます :-)

https://github.com/GoogleContainerTools/jib

このプロジェクトでは Mavenプラグイン があり、コードのパッケージングを直接Mavenのワークフローに統合します。


オリジナルの回答 (完全性を保つために含まれていますが、かなり前に書かれたものです)

新しい公式イメージを使用してみてください。

https://registry.hub.docker.com/_/maven/

このイメージは、コンパイルされたアプリケーションを作成するためにビルド時に Maven を実行したり、次の例のように、コンテナ内で Maven ビルドを実行するために使用することができます。

例 1 - コンテナー内で Maven を実行する

次のコマンドは、コンテナ内で Maven ビルドを実行します。

docker run -it --rm \
       -v "$(pwd)":/opt/maven \
       -w /opt/maven \
       maven:3.2-jdk-7 \
       mvn clean install

注意事項

  • この方法の優れた点は、すべてのソフトウェアがコンテナ内にインストールされ、実行されていることです。ホスト マシン上で docker が必要なだけです。
  • 参照 このバージョンの Dockerfile

例2 - Nexusを使用してファイルをキャッシュする

Nexusコンテナを実行する

docker run -d -p 8081:8081 --name nexus sonatype/nexus

"settings.xml"ファイルを作成します。

<settings>
  <mirrors>
    <mirror>
      <id>nexus</id>
      <mirrorOf>*</mirrorOf>
      <url>http://nexus:8081/content/groups/public/</url>
    </mirror>
  </mirrors>
</settings>

Mavenをnexusコンテナにリンクして実行し、依存関係がキャッシュされるようにします。

docker run -it --rm \
       -v "$(pwd)":/opt/maven \
       -w /opt/maven \
       --link nexus:nexus \
       maven:3.2-jdk-7 \
       mvn -s settings.xml clean install

注意事項

  • Nexus をバックグラウンドで実行する利点は、ローカル コンテナーで実行されている Maven ビルドに対して透過的に、管理 URL を介して他のサード パーティーのリポジトリを管理できることです。