Jak dokerować maven project? i jak wiele sposobów, aby to osiągnąć?

Jestem nowy w Dockerze i nie wiem, jak uruchomić projekt java z maven, mimo że czytałem wiele dokumentów i próbowałem wielu metod.

  1. Czy powinienem zbudować obraz używając Dockerfile?
  2. Jak wyglądają polecenia, gdy jest uruchamianie projektu maven na hoście za pomocą Dockerfile?
Author: Riad, 2015-01-04

3 answers

Spróbuj użyć nowych oficjalnych obrazów, jest jeden dla Mavena

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

Obraz może być użyty do uruchomienia Mavena w czasie kompilacji w celu utworzenia skompilowanej aplikacji lub, jak w poniższych przykładach, do uruchomienia kompilacji Mavena w kontenerze.

Przykład 1-Maven działa w kontenerze

Następujące polecenie uruchamia Twój Maven build wewnątrz kontenera:

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

Uwagi:

  • The neat thing about this podejście polega na tym, że całe oprogramowanie jest zainstalowane i uruchomione w kontenerze. Wystarczy docker na maszynie hosta.
  • Zobacz Dockerfile dla tej wersji

Przykład 2 - Użyj Nexusa do buforowania plików

Uruchom kontener Nexus

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

Utwórz " ustawienia.plik xml":

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

Teraz uruchom Mavena łączącego się z kontenerem nexus, aby zależności były buforowane

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

Uwagi:

  • zaletą uruchomienia Nexusa w tłem jest to, że inne repozytoria innych firm mogą być zarządzane poprzez admin URL przejrzyście do Maven buduje uruchomione w lokalnych kontenerach.
[13]} Aktualizacja (2018-04-06)

Opcja "--link " w Dockerze została wycofana. Aby wykorzystać natywny DNS Dockera, możesz uruchomić powyższy przykład w następujący sposób]}

#
# Create a common container network
#
docker network create build

#
# Run the containers on this network
#
docker run -d --network build -p 8081:8081 --name nexus sonatype/nexus
docker run -it --rm --network build \
       -v "$(pwd)":/opt/maven \
       -w /opt/maven \
       maven:3.2-jdk-7 \
       mvn -s settings.xml clean install
 24
Author: Mark O'Connor,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-06 15:44:38

Może być wiele sposobów.. Ale zaimplementowałem postępując na dwa sposoby

Podany przykład dotyczy projektu maven.

1. Używanie pliku Dockerfile w projekcie maven

Użyj następującej struktury plików:

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

I zaktualizuj plik Dockerfile jako:

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

Przejdź do folderu projektu i wpisz następujące polecenie będziesz ab le stworzyć obraz i uruchomić ten obraz:

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

Pobierz film na Spring Boot with Docker

2. Korzystanie z wtyczek Maven

Dodaj dany plugin Mavena w 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>

Przejdź do folderu projektu i wpisz następujące polecenie będziesz mógł utworzyć obraz i uruchomić ten obraz:

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

W pierwszym przykładzie tworzymy plik Dockerfile i dostarczamy obraz bazowy oraz dodajemy jar an so, po wykonaniu tej czynności uruchomimy polecenie docker, aby zbudować obraz o określonej nazwie, a następnie uruchomić ten obraz..

Natomiast w drugim przykładzie jesteśmy używając wtyczki maven, w której dostarczamy baseImage i imageName, więc nie musimy tutaj tworzyć pliku Dockerfile.. po spakowaniu projektu maven otrzymamy obraz dokera i musimy go tylko uruchomić..

 33
Author: Riddhi Gohil,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-02 20:56:20

Z reguły powinieneś zbudować fat JAR używając Mavena (JAR, który zawiera zarówno Twój kod, jak i wszystkie zależności).

Następnie możesz napisać Dockerfile, który odpowiada Twoim wymaganiom(jeśli możesz zbudować fat JAR, potrzebujesz tylko bazowego systemu operacyjnego, takiego jak CentOS i JVM).

To jest to, czego używam do aplikacji Scala (która jest oparta na Javie).

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

Tworzy to obraz oparty na CentOS z Java7. Po uruchomieniu uruchomi Twój jar aplikacji.

The najlepszym sposobem wdrożenia jest poprzez rejestr Dockera, to jak Github dla obrazów Dockera.

Możesz zbudować taki obraz:

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

Możesz następnie wypchnąć obraz w ten sposób:

docker push username/projectname # this pushes all tags

Gdy obraz znajdzie się w rejestrze dokera, możesz go pobrać z dowolnego miejsca na świecie i uruchomić.

Aby uzyskać więcej informacji, zobacz Docker User Guide.

O czym warto pamiętać :

Można również wyciągnąć repozytorium wewnątrz obrazu i zbudować jar jako część wykonania kontenera, ale nie jest to dobre podejście, ponieważ kod może się zmienić i możesz skończyć używając innej wersji aplikacji bez powiadomienia.

Budowanie słoika tłuszczu usuwa ten problem.

 9
Author: Matteo Pacini,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-01-04 16:29:19