Exemple de travail.
Ce n'est pas un tutoriel de démarrage à ressort. C'est la réponse mise à jour à une question sur la façon d'exécuter une build Maven dans un conteneur Docker.
Question postée il y a 4 ans.
1. Générez une application
Utilisez l'initialiseur de printemps pour générer une application de démonstration
https://start.spring.io/
Extraire l'archive zip localement
2. Créez un 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"]
Remarque
- Cet exemple utilise une génération en plusieurs étapes . La première étape est utilisée pour construire le code. La deuxième étape ne contient que le jar construit et un JRE pour l'exécuter (notez comment le jar est copié entre les étapes).
3. Construisez l'image
docker build -t demo .
4. Exécutez l'image
$ 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)
Divers
Lisez la documentation du concentrateur Docker sur la façon dont la version Maven peut être optimisée pour utiliser un référentiel local pour mettre en cache les fichiers JAR.
Mise à jour (2019-02-07)
Cette question a maintenant 4 ans et pendant ce temps, il est juste de dire que la création d'applications à l'aide de Docker a subi des changements importants.
Option 1: construction en plusieurs étapes
Ce nouveau style vous permet de créer des images plus légères qui n'encapsulent pas vos outils de construction et votre code source.
L'exemple ici utilise à nouveau l' image de base officielle de maven pour exécuter la première étape de la construction en utilisant une version souhaitée de Maven. La deuxième partie du fichier définit la façon dont le pot construit est assemblé dans l'image de sortie finale.
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"]
Remarque:
- J'utilise l' image de base sans distraction de Google , qui s'efforce de fournir juste assez de temps d'exécution pour une application java.
Option 2: flèche
Je n'ai pas utilisé cette approche mais semble digne d'être enquêtée car elle vous permet de créer des images sans avoir à créer des choses désagréables comme Dockerfiles :-)
https://github.com/GoogleContainerTools/jib
Le projet dispose d'un plugin Maven qui intègre l'empaquetage de votre code directement dans votre workflow Maven.
Réponse originale (incluse pour être complète, mais écrite il y a longtemps)
Essayez d'utiliser les nouvelles images officielles, il y en a une pour Maven
https://registry.hub.docker.com/_/maven/
L'image peut être utilisée pour exécuter Maven au moment de la génération pour créer une application compilée ou, comme dans les exemples suivants, pour exécuter une build Maven dans un conteneur.
Exemple 1 - Maven s'exécutant dans un conteneur
La commande suivante exécute votre build Maven dans un conteneur:
docker run -it --rm \
-v "$(pwd)":/opt/maven \
-w /opt/maven \
maven:3.2-jdk-7 \
mvn clean install
Remarques:
- L'avantage de cette approche est que tous les logiciels sont installés et exécutés dans le conteneur. Seulement besoin de docker sur la machine hôte.
- Voir Dockerfile pour cette version
Exemple 2 - Utiliser Nexus pour mettre en cache des fichiers
Exécutez le conteneur Nexus
docker run -d -p 8081:8081 --name nexus sonatype/nexus
Créez un fichier "settings.xml":
<settings>
<mirrors>
<mirror>
<id>nexus</id>
<mirrorOf>*</mirrorOf>
<url>http://nexus:8081/content/groups/public/</url>
</mirror>
</mirrors>
</settings>
Maintenant, exécutez Maven liant au conteneur nexus, de sorte que les dépendances soient mises en cache
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
Remarques:
- Un avantage de l'exécution de Nexus en arrière-plan est que d'autres référentiels tiers peuvent être gérés via l'URL d'administration de manière transparente pour les builds Maven exécutés dans des conteneurs locaux.
mavenCentral()
dans mes dépendances gradle parmaven {url "http://nexus:8081..."
et je reçois maintenant juste des problèmes de résolution.