web-dev-qa-db-ja.com

Mavenプロジェクトをドッキングする方法は?そしてそれを達成する方法はいくつありますか?

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

  1. Dockerfileを使用してイメージを構築する必要がありますか?
  2. ホストでDockerfileを使用してMavenプロジェクトを実行する場合のコマンドは何ですか?
60
Yashon Lin

作業例。

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

質問はもともと4年前に投稿されました。

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

スプリングイニシャライザーを使用してデモアプリを生成する

https://start.spring.io/

enter image description here

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)

その他

ローカルリポジトリを使用してjarをキャッシュするためにMavenビルドを最適化する方法については、Dockerハブのドキュメントを参照してください。

更新(2019-02-07)

この質問は現在4年目であり、その間にDockerを使用したアプリケーションの構築が大幅に変更されたと言っても過言ではありません。

オプション1:マルチステージビルド

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

ここの例でも、 official maven ベースイメージを使用して、目的のバージョンのMavenを使用してビルドの最初のステージを実行します。ファイルの2番目の部分は、ビルドされた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の distroless ベースイメージを使用しています。これは、Javaアプリに十分なランタイムを提供するよう努めています。

オプション2:ジブ

私はこのアプローチを使用していませんが、Dockerfilesのような厄介なものを作成せずにイメージを構築できるため、調査する価値があると思われます:-)

https://github.com/GoogleContainerTools/jib

プロジェクトには Mavenプラグイン があり、コードのパッケージ化を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>

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

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を介して他のサードパーティリポジトリを管理できることです。
58
Mark O'Connor

多くの方法があります。しかし、私は次の2つの方法で実装しました

与えられた例は、Mavenプロジェクトです。

1。 MavenプロジェクトでDockerfileを使用する

次のファイル構造を使用します。

Demo
└── src
|    ├── main
|    │   ├── Java
|    │       └── org
|    │           └── demo
|    │               └── Application.Java
|    │   
|    └── test
|
├──── Dockerfile
├──── pom.xml

そして、Dockerfileを次のように更新します。

FROM Java:8
EXPOSE 8080
ADD /target/demo.jar demo.jar
ENTRYPOINT ["Java","-jar","demo.jar"]

プロジェクトフォルダーに移動し、次のコマンドを入力して、イメージを作成し、そのイメージを実行します。

$ mvn clean
$ mvn install
$ docker build -f Dockerfile -t springdemo .
$ docker run -p 8080:8080 -t springdemo

でのビデオの取得Spring Boot with Docker

2。 Mavenプラグインの使用

指定されたMavenプラグインをpom.xmlに追加します

<plugin>
    <groupId>com.spotify</groupId>
    <artifactId>docker-maven-plugin</artifactId>
    <version>0.4.5</version>
        <configuration>
            <imageName>springdocker</imageName>
            <baseImage>Java</baseImage>
            <entryPoint>["Java", "-jar", "/${project.build.finalName}.jar"]</entryPoint>
            <resources>
                <resource>
                    <targetPath>/</targetPath>
                    <directory>${project.build.directory}</directory>
                    <include>${project.build.finalName}.jar</include>
                </resource>
            </resources>
        </configuration>
    </plugin>

プロジェクトフォルダーに移動し、次のコマンドを入力して、イメージを作成し、そのイメージを実行できます。

$ mvn clean package docker:build
$ docker images
$ docker run -p 8080:8080 -t <image name>

最初の例では、Dockerfileを作成してベースイメージを提供し、jarを追加します。その後、dockerコマンドを実行して特定の名前のイメージを構築し、そのイメージを実行します。

2番目の例では、baseImageimageNameを提供するmavenプラグインを使用しているため、ここでDockerfileを作成する必要はありません。そのイメージを実行するために..

43
Riddhi Gohil

経験則として、Maven(コードとすべての依存関係の両方を含むJAR)を使用してfat JARを構築する必要があります。

次に、要件に一致するDockerfileを記述できます(太いJARを構築できる場合は、CentOSなどの基本OSとJVMのみが必要です) )。

これは、Scalaアプリ(Javaベース)に使用するものです。

FROM centos:centos7

# Prerequisites.

RUN yum -y update
RUN yum -y install wget tar

# Oracle Java 7

WORKDIR /opt

RUN wget --no-cookies --no-check-certificate --header "Cookie: gpw_e24=http%3A%2F%2Fwww.Oracle.com%2F; oraclelicense=accept-securebackup-cookie" http://download.Oracle.com/otn-pub/Java/jdk/7u71-b14/server-jre-7u71-linux-x64.tar.gz
RUN tar xzf server-jre-7u71-linux-x64.tar.gz
RUN rm -rf server-jre-7u71-linux-x64.tar.gz
RUN alternatives --install /usr/bin/Java java /opt/jdk1.7.0_71/bin/Java 1

# App

USER daemon

# This copies to local fat jar inside the image
ADD /local/path/to/packaged/app/appname.jar /app/appname.jar

# What to run when the container starts
ENTRYPOINT [ "Java", "-jar", "/app/appname.jar" ]

# Ports used by the app
EXPOSE 5000

これにより、Java7でCentOSベースのイメージが作成されます。開始すると、アプリjarが実行されます。

これをデプロイする最良の方法は、Dockerレジストリを使用することです。これは、Dockerイメージ用のGithubのようなものです。

次のようなイメージを作成できます。

# current dir must contain the Dockerfile
docker build -t username/projectname:tagname .

この方法で画像をプッシュできます:

docker Push username/projectname # this pushes all tags

イメージがDockerレジストリに登録されると、世界中のどこからでもそれを取得して実行できます。

詳細については、 Dockerユーザーガイド を参照してください。

心に留めておくべきこと

リポジトリをイメージ内にプルし、コンテナー実行の一部としてjarをビルドすることもできますが、コードが変更される可能性があり、予告なしに別のバージョンのアプリを使用する可能性があるため、良いアプローチではありません。

ファットjarを作成すると、この問題はなくなります。

11
Matteo Pacini