[解決済み] mavenプロジェクトをdockerizeする方法と、それを達成するための方法を教えてください。
質問
私はDockerの初心者で、多くのドキュメントを読み、多くの方法を試しましたが、mavenでjavaプロジェクトを実行する方法がわかりません。
-
を使用してイメージを構築する必要があります。
Dockerfile
? -
を指定したホストでmavenプロジェクトを実行する場合、コマンドはどのようになりますか?
Dockerfile
?
どのように解決するのですか?
動作例です。
これはspring bootのチュートリアルではありません。Dockerコンテナ内でMavenビルドを実行する方法についての質問に対する、更新された回答です。
質問はもともと4年前に投稿されたものです。
1. アプリケーションを生成する
Springイニシャライザーを使って、デモアプリを生成します。
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 を介して他のサード パーティーのリポジトリを管理できることです。
関連
-
[解決済み】Dockerのビルドコンテキスト外のファイルをインクルードする方法とは?
-
アクセス制限です。タイプ 'Application' は API ではありません。
-
mavenプロジェクトのテストエラー java.lang.ClassNotFoundException: org.glassfish.jersey.client.ClientConfig の問題を解決する。
-
[解決済み] Mavenを使用して、依存関係を持つ実行可能なJARを作成するにはどうすればよいですか?
-
[解決済み] ホストからDockerコンテナにファイルをコピーする方法は?
-
[解決済み] Could not find or load main class "とはどういう意味ですか?
-
[解決済み] java.lang.UnsupportedClassVersionError を修正する方法。サポートされていないメジャー.マイナーバージョン
-
[解決済み] Dockerコンテナのシェルに入るにはどうしたらいいですか?
-
[解決済み] Mavenプロジェクトにローカルのjarファイルを追加する方法は?
-
[解決済み] Dockerでデータベースなどの永続的なストレージを扱う方法
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
myeclipseでコンパイルするとAntエラーが発生する javaの例外が発生しました。
-
アクセス制限について アプリケーションの種類がAPIでない(必要なライブラリの制限)。
-
アクセス制限です。タイプ 'Application' は API ではありません。
-
Dateが型に解決できない問題を解決する
-
Android Studio 3.1.2 で v4, v7 パッケージが見つからない シンボル 'AppCompatActivity' を解決できない
-
javaの模造品QQ WeChatのチャットルーム
-
org.glassfish.jersey.servlet.ServletContainer
-
HttpClientがGZIP形式でない場合の対処法
-
Java(1)仕上げの基本概念+eclipseのインストール構成
-
Maven Pluginの実行がライフサイクル設定の対象外であるエラーの解決