Maven débardeur cache dépendances
Je suis en train d'utiliser docker pour automatiser maven construit. Le projet que je veux construire prend près de 20 minutes pour télécharger toutes les dépendances, donc j'ai essayé de construire un docker image qui cache ces dépendances, mais il ne semble pas à l'enregistrer. Mon Dockerfile est
FROM maven:alpine
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app
ADD pom.xml /usr/src/app
RUN mvn dependency:go-offline
L'image construit, et il n'télécharger tout. Cependant, l'image résultante est la même taille que la base maven:alpine
de l'image, de sorte qu'il ne semble pas avoir mis en cache les dépendances dans l'image. Lorsque j'essaie d'utiliser l'image de mvn compile
il va à travers les 20 minutes de télécharger à nouveau le tout.
Est-il possible de construire une maven image que les caches de mes dépendances de sorte qu'ils n'ont pas besoin de télécharger à chaque fois que j'utilise l'image pour effectuer un build?
Je suis en exécutant les commandes suivantes:
docker build -t my-maven .
docker run -it --rm --name my-maven-project -v "$PWD":/usr/src/mymaven -w /usr/src/mymaven my-maven mvn compile
Ma compréhension est que, quelle que soit RUN
durant le docker processus de construction devient une partie de l'image qui en résulte.
- Faire un conteneur de données qui contient le téléchargement des artefacts...Combien de modules construisez-vous? Combien de tests courez-vous? La Cause de 20 minutes de sons très long?
- Pouvez-vous expliquer ce que vous entendez par conteneur de données? J'ai pensé que je finirais avec une maven image que les données. Ne pas "mvn dependency:allez-hors ligne" enregistrer ces dépendances sur le système de fichiers local?
- Si vous avez des modifications sur le système de fichiers local, ceux-ci seront jetés si vous redémarrez votre conteneur...
- Je reçois, mais je ne parle pas d'un conteneur. Je parle du docker processus de construction. Ma compréhension est que l'état du système à la fin de docker construire est une partie de l'image.
- Vous pouvez considérer ceci: stackoverflow.com/a/49891339/1054322
- Pourrait être utile: medium.com/pismolabs/...
- cela fonctionne comme vous vous attendez à ce que la
VOLUME
déclaration a été supprimé depuis Dec'17 github.com/carlossg/docker-maven/pull/57
Vous devez vous connecter pour publier un commentaire.
Généralement, il n'y a pas de changement dans
pom.xml
fichier, mais seulement certains d'autres modifications du code source lorsque vous tentez de démarrer le panneau de l'image de construire. Dans de telles circonstances, vous pouvez le faire:pour info:
Donc, la clé est:
ajouter
pom.xml
fichier.puis
mvn verify --fail-never
, il va télécharger les dépendances maven.ajouter tous vos fichier source, et de commencer votre compilation(
mvn package
).Quand il y a des changements dans votre
pom.xml
fichier ou que vous exécutez ce script pour la première fois, docker va faire 1 -> 2 -> 3. Quand il n'y a pas de changements danspom.xml
fichier, docker va passer directement à l'étape 1, le 2 et 3 directement.Cette simple astuce peut être utilisée dans de nombreux autres package de gestion des cas(gradle、fil、mnp、pip).
Edit:
Vous devriez également envisager l'utilisation de
mvn dependency:resolve
oumvn dependency:go-offline
en conséquence que les autres commentaires & réponses suggèrent.mvn dependency:resolve
pour télécharger les dépendances, pasmvn verify --fail-never
- c'est d'ailleurs télécharge les dépendances, mais ce n'est pas le but de la commande.dependency:resolve
de ne pas télécharger les plugins. Et malheureusementdependency:resolve-plugins
manque également du cycle de vie des plugins.dependency:go-offline
Il s'avère que l'image que je suis en utilisant comme base a un parent de l'image qui définit
voir: https://github.com/carlossg/docker-maven/blob/322d0dff5d0531ccaf47bf49338cb3e294fd66c8/jdk-8/Dockerfile
Le résultat est que, au cours de la construction, tous les fichiers sont écrits pour
$USER_HOME_DIR/.m2
, mais parce que c'est censé être un volume, aucun de ces fichiers sont conservées avec le conteneur de l'image.Actuellement dans le Panneau il n'y a pas moyen d'annuler l'inscription de ce volume, définition, de sorte qu'il serait nécessaire de construire un distinct maven image, plutôt que d'utiliser la langue officielle de maven image.
-Dmaven.repo.local=/mvn/.m2nrepo/repository
@Kim est plus proche, mais il n'est pas encore là. Je ne pense pas que l'ajout de
--fail-never
est correct, même à travers elle obtenir le travail fait.La
verify
de commande provoque un grand nombre de plugins pour l'exécuter ce qui est un problème (pour moi) - je ne pense pas qu'ils devraient être en cours d'exécution lorsque tout ce que je veux, c'est d'installer les dépendances! J'ai aussi un multi-module de génération et un javascript sous-construire de sorte que cette situation complique l'installation.Mais seulement
verify
n'est pas assez, parce que si vous exécutezinstall
dans les commandes suivantes, il y aura plus de plugins utilisés - ce qui signifie plus de dépendances à télécharger - maven refuse de télécharger le contraire. Pertinentes lire: Maven: Introduction à la construction du Cycle de vieVous avez essentiellement à trouver ce que les propriétés de désactiver tous les plugins et les ajouter un par un, afin de ne pas briser votre build.
mais certains plugins ne sont pas facilement ignoré - je ne suis pas un maven expert (donc je ne sais pas pourquoi, il ignore la cli option - il est peut-être un bug), mais fonctionne comme prévu pour
org.codehaus.mojo:exec-maven-plugin
remarquez l'explicite
<skip>${maven.exec.skip}</skip>
- autres plugins de prendre cette place à partir de la cli params mais pas celui-ci (ni-Dmaven.exec.skip=true
ni-Dexec.skip=true
travail par lui-même)Espère que cette aide
Similaire avec @Kim réponse, mais j'utilise
dependency:resolve
mvn de commande. Voici donc ma Dockerfile:dependency:resolve
argument et l'adoption de plusieurs étapes images amélioré mon temps de construire considérablement. Merci beaucoup!Je ne pense pas que les autres réponses ici sont optimales. Par exemple, le
mvn vérifier
réponse exécute les étapes suivantes, et fait beaucoup plus que simplement de résoudre les dépendances:L'ensemble de ces phases et de leurs objectifs n'ont pas besoin d'être couru si vous voulez seulement de résoudre les dépendances.
Si vous souhaitez seulement à résoudre des dépendances, vous pouvez utiliser le
de la dépendance:allez-hors ligne
objectif:Après quelques jours de galère, j'ai réussi à faire cette mise en cache plus tard en utilisant l'intermédiaire contrainer, et j'aimerais résumer mes conclusions ici, car ce sujet est donc utile et souvent montré dans la recherche Google, frontpage:
L'idée est de garder toutes les dépendances dans une image différente que Maven pouvez utiliser immédiatement
Il pourrait y avoir d'autres scénarios que je n'ai pas rencontré encore, mais cette solution de secours-moi un peu de téléchargement 3GB ordures à chaque fois
Je ne peux pas imaginer pourquoi Java est devenu une graisse de baleine aujourd'hui dans le lean monde
J'ai eu ce problème il suffit d'un peu de tout à l'heure. L'existe de nombreuses solutions sur le web, mais la seule qui a fonctionné pour moi est tout simplement monter un volume pour le maven répertoire des modules:
puis dans le Dockerfile:
Il existe de meilleures solutions, mais pas aussi simple.
Ce blog va le mile supplémentaire pour vous aider à tout mettre en cache:
https://keyholesoftware.com/2015/01/05/caching-for-maven-docker-builds/
VOLUME
ne fonctionne pas pendant le docker phase de développement.VOLUME <outdir>:<innerdir>
Il y a deux façons pour mettre en cache les dépendances maven:
Exécuter la commande "mvn vérifier" dans le cadre d'un conteneur d'exécution, de ne PAS construire, et assurez-vous de monter .m2 de un volume.
C'est efficace, mais il ne joue pas bien, avec des nuages de construire et de construire plusieurs esclaves
Utiliser un "dépendances cache conteneur", et de les mettre à jour périodiquement. Voici comment:
un. Créer un Dockerfile qui copie le pom et de construire hors des dépendances:
b. Construire périodiquement (par exemple tous les soirs) comme "Deps:le dernier"
c. Créer un autre Dockerfile pour construire le système par commit (utilisez de préférence multi-étape) - et assurez-vous que c'est à PARTIR de Deps.
À l'aide de ce système, vous aurez rapidement, reconstruire-mesure s'appuie surtout de bonne suffisamment de mémoire cache.
À L'Aide De BuildKit
De
Docker v18.03
, vous pouvez utiliser BuildKit au lieu de volumes qui ont été mentionnées dans les autres réponses. Il permet le montage des caches qui peuvent persister entre construit et vous pouvez éviter le téléchargement de contenu du correspondant.m2/repository
à chaque fois.En supposant que le Dockerfile est à la racine de votre projet:
target=/root/.m2
monte cache à l'endroit spécifié dans maven image Dockerfile docs.Pour le bâtiment, vous pouvez exécuter la commande suivante:
Plus d'infos sur BuildKit peut être trouvé ici.
Si les dépendances sont téléchargés après le container est déjà en place, alors vous avez besoin pour valider les modifications sur ce conteneur et de créer une nouvelle image avec le téléchargé artefacts.