


Optimisation des images Java Docker pour une taille plus petite et un démarrage plus rapide
Jul 29, 2025 am 12:27 AMUtilisez des images de base plus petites telles que l'éclipse-térine: 17-jre-alpine ou -slim pour réduire le volume; 2. Utilisez la construction en plusieurs étapes pour séparer les environnements de compilation et d'exécution pour éviter de lancer les outils de construction et le code source dans l'image finale; 3. Optimiser le package JAR lui-même, supprimer les dépendances inutiles, activer la compression et considérer le pot hiérarchique de démarrage Spring; 4. Activer le partage de données de classe (CDS) pour réduire le temps de démarrage et l'utilisation de la mémoire; 5. Ajuster les paramètres de contenerisation JVM tels que -xx: useContainersupport et -xx: maxrampercentage pour s'adapter aux limitations des ressources du conteneur; 6. La mise en miroir native de Graalvm peut être utilisée dans des scénarios avec des exigences de vitesse de démarrage extrêmement élevées, ce qui améliore considérablement les performances mais augmente la complexité de la construction; L'utilisation combinée des cinq premiers éléments peut obtenir de bons résultats d'optimisation à faible complexité, et la mise en miroir native convient aux applications natives du nuage qui sont sensibles au démarrage à froid.
L'optimisation des images Java Docker ne concerne pas seulement la tailles de fichiers - il s'agit de déploiements plus rapides, de surface d'attaque réduite et de temps de démarrage plus rapides, en particulier dans les environnements cloud et sans serveur. Voici comment rendre votre prêteur d'images Java Docker et plus efficace.

1. Utilisez une image de base plus petite
L'image de base que vous choisissez a un impact massif sur la taille. openjdk:17-jdk
ou openjdk:17
images sont basées sur des distributions linux complètes comme Debian et peuvent dépasser 500 Mo.
De meilleures options:

-
eclipse-temurin:17-jre-alpine
- Alpine Linux est minuscule (~ 5 Mo de base), et Jre uniquement réduit l'empreinte. -
eclipse-temurin:17-jre-slim
- basée à Debian mais dépouillée. Plus compatible qu'Alpine, encore beaucoup plus petit que JDK complet.
# au lieu de: # D'OpenJdk: 17 # Utiliser: De Eclipse-Temurin: 17-Jre-Alpine
?? Remarque: Alpine utilise
musl
au lieu deglibc
, ce qui peut entra?ner des problèmes de compatibilité avec certaines bibliothèques natives. Si vous touchez des problèmes, allez avec-slim
à la place.
2. Build et exécuter en étapes distinctes (construction en plusieurs étapes)
évitez de regrouper les outils de construction, le code source et les dépendances dans votre image finale.

# Multi-stage: construire avec JDK complet, exécuter avec JRE De Eclipse-Temurin: 17-JDK-Alpine en tant que constructeur WorkDir / App Copie. . Exécuter ./gradlew build -x test De Eclipse-Temurin: 17-Jre-Alpine WorkDir / App Copier --From = Builder /App/build/libs/app.jar app.jar Cmd ["java", "-jar", "app.jar"]
Cela maintient l'image d'exécution minimum - pas de gradle, de fichiers source ou d'outils de développement.
3. Optimiser le pot lui-même
Un gros pot (Uber-Jar) avec toutes les dépendances inclus est pratique mais peut être gonflé.
Conseils:
- Supprimez les dépendances inutilisées - Utilisez des outils tels que la dépendance à la dépendance ou l'examen manuel.
- Utilisez le pot mince de Spring Boot (le cas échéant) - Déchargez les dépendances à une couche partagée.
- Activer la compression du pot - la plupart des outils de construction le font par défaut, mais vérifiez.
Conseil de pro: Si vous utilisez Spring Boot, considérez Spring Boot 3.2 avec la prise en charge de l'image de conteneur qui superpose le contenu JAR pour une meilleure mise en cache de couche Docker.
4. Activer le partage de données de classe (CDS)
Le partage de données de classe permet au JVM de précharger les classes de base de la carte de mémoire, réduisant le temps de démarrage et l'utilisation de la mémoire.
Générez une archive CDS pendant la construction d'images:
De Eclipse-Temurin: 17-Jre-Alpine Copier app.jar /app.jar # Générer des archives CDS Exécuter Java -Xshare: Dump -xx: archiveClassesatexit = / app.jsa -jar /app.jar # Ou si vous connaissez la classe principale: # Exécuter java -cp app.jar -xshare: Dump -xx: archiveclassesatexit = / app.jsa com.example.main # Utilisez des CD à l'exécution EntryPoint ["java", "-xshare: auto", "-xx: sharedarchivefile = / app.jsa", "-jar", "app.jar"]
Cela peut réduire le temps de démarrage de 10 à 30%, en particulier pour les applications avec de nombreuses dépendances.
5. régler les paramètres JVM pour les conteneurs
Par défaut, le JVM peut ne pas respecter les limites de mémoire du conteneur.
Ajoutez ces drapeaux:
Point d'entrée ["Java", \ "-Xx: usecontainersupport", \ "-Xx: maxrampercentage = 75.0", \ "-Xshowsettings: VM", \ "-jar", "app.jar"]
-
UseContainerSupport
permet à JVM de détecter les limites des conteneurs. -
MaxRAMPercentage
évite le tas de surallocation.
Cela empêche l'OOM-tus et améliore la prédiction des startups.
6. Considérez les images natives (GraalVM) pour une optimisation extrême
Pour le démarrage le plus rapide et l'empreinte la plus petite, compilez votre application Java à un binaire natif à l'aide de l'image native Graalvm .
Avantages:
- Startup en millions de secondes.
- Empreinte mémoire plus petite.
- Image plus petite (pas de JVM nécessaire).
Inconvénients:
- Temps de construction plus long.
- Réflexion limitée / chargement de classe dynamique (nécessite une configuration).
- Image de construction plus grande.
Exemple:
# Build Stage avec graalvm De ghcr.io/graalvm/graalvm-jdk:17 en tant que constructeur Exécuter GU installer natif-image Copie. . Exécutez Native-Image -Jar App.jar # Stage final De Alpine: dernier Copier --From = Builder App / App Entrée ["./app"]
Mieux pour les outils de microservices, sans serveur ou CLI où le démarrage rapide est critique.
Résumé des gains
Optimisation | Réduction de la taille | Amélioration des startups |
---|---|---|
Base alpine / jre | 30–50% | Mineure |
Construction en plusieurs étapes | 20–40% | Aucun |
CDS | Minimal | 10–30% |
Image native | 50–80% | 80–95% plus rapidement |
Choisissez le bon combo en fonction de vos besoins. Pour la plupart des applications, les CD à plusieurs étages de base mince donne d'excellents résultats sans complexité. Pour les services natifs du cloud, le natif de Graalvm vaut l'investissement.
Fondamentalement, n'expédie pas pour un centre de données de JDK juste pour exécuter un pot.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Outils d'IA chauds

Undress AI Tool
Images de déshabillage gratuites

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Clothoff.io
Dissolvant de vêtements AI

Video Face Swap
échangez les visages dans n'importe quelle vidéo sans effort grace à notre outil d'échange de visage AI entièrement gratuit?!

Article chaud

Outils chauds

Bloc-notes++7.3.1
éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Sujets chauds

Maven est un outil standard pour la gestion et la construction de projet Java. La réponse réside dans le fait qu'il utilise pom.xml pour normaliser la structure du projet, la gestion des dépendances, l'automatisation du cycle de vie de la construction et les extensions de plug-in; 1. Utilisez pom.xml pour définir GroupID, Arfactive, version et dépendances; 2. Commandes Master Core telles que MvnClean, compiler, tester, package, installer et déploier; 3. Utiliser la fonction de dépendance et les exclusions pour gérer les versions et les conflits de dépendance; 4. Organisez de grandes applications via la structure du projet multi-modules et sont gérées uniformément par le POM parent; 5

Setupamaven / gradleprojectwithjax-rsDependces likejersey; 2.CreateArestResourceUsingannotationsSuchas @ pathand @ get; 3.ConfigureTheApplicationViaApplicationsUbclassorweb.xml; 4.AddjacksonforjsonBindingByCludingJersey-Media-Json-Jackson; 5.DeploEp

@Property Decorator est utilisé pour convertir les méthodes en propriétés pour implémenter le contr?le de lecture, de réglage et de suppression des propriétés. 1. Utilisation de base: définissez des attributs en lecture seule via @Property, tels que la zone calculée en fonction du rayon et accédé directement; 2. Utilisation avancée: utilisez @ name.setter et @ name.deleter pour implémenter les opérations de vérification et de suppression de l'attribut d'attribut; 3. Application pratique: effectuer la vérification des données dans les setters, tels que BankAccount pour s'assurer que le solde n'est pas négatif; 4. Spécification de dénomination: les variables internes sont préfixées, les noms de méthode de propriété sont cohérents avec les attributs et le contr?le d'accès unifié est utilisé pour améliorer la sécurité et la maintenabilité du code.

Tout d'abord, utilisez JavaScript pour obtenir les préférences du système utilisateur et les paramètres de thème stockés localement et initialiser le thème de la page; 1. La structure HTML contient un bouton pour déclencher la commutation du sujet; 2. CSS utilise: Root pour définir des variables de thème brillantes, la classe de mode. Dark définit les variables de thème sombres et applique ces variables via var (); 3. JavaScript détecte préfère-Color-Scheme et lit LocalStorage pour déterminer le thème initial; 4. Communiquez la classe en mode noir sur l'élément HTML lorsque vous cliquez sur le bouton et enregistre l'état actuel vers LocalStorage; 5. Tous les changements de couleur sont accompagnés d'une animation de transition de 0,3 seconde pour améliorer l'utilisateur

Pour générer des valeurs de hachage à l'aide de Java, il peut être implémenté via la classe MessagediGest. 1. Obtenez une instance de l'algorithme spécifié, tel que MD5 ou SHA-256; 2. Appelez la méthode .update () à transmettre les données à chiffrer; 3. Appelez la méthode .digest () pour obtenir un tableau d'octets de hachat; 4. Convertir le tableau d'octets en une cha?ne hexadécimale pour la lecture; Pour les entrées telles que les fichiers gros, lisez dans des morceaux et appelez .Update () plusieurs fois; Il est recommandé d'utiliser SHA-256 au lieu de MD5 ou SHA-1 pour assurer la sécurité.

Oui, un menu déroulant CSS commun peut être implémenté via Pure HTML et CSS sans JavaScript. 1. Utilisez des ul imbriqués et Li pour construire une structure de menu; 2. Utilisez le: Hover Pseudo-Class pour contr?ler l'affichage et la cachette du contenu déroulant; 3. Position définie: relative pour le parent li, et le sous-menu est positionné en utilisant la position: absolue; 4. Le sous-menu défaut par défaut: Aucun, qui devient affichage: Block lorsqu'il a survolé; 5. Le tir-down à plusieurs niveaux peut être réalisé grace à la nidification, combinée à la transition, et à l'ajout d'animations fondues, et adaptées aux terminaux mobiles avec des requêtes multimédias. La solution entière est simple et ne nécessite pas de prise en charge JavaScript, qui convient au grand

InstallerDockerDesktop, Vscode et TheofficialDockerextenfrommicRosoft.2

Utilisez dateTime.Strptime () pour convertir les cha?nes de date en objet DateTime. 1. Utilisation de base: Parse "2023-10-05" comme objet DateTime via "% y-% m-% d"; 2. prend en charge plusieurs formats tels que "% m /% d /% y" pour analyser les dates américaines, "% d /% m /% y" pour analyser les dates britanniques, "% b% d,% y% i:% m% p" pour analyser le temps avec AM / PM; 3. Utilisez dateUtil.parser.parse () pour déduire automatiquement les formats inconnus; 4. Utiliser .d
