[DOCKER] Comment créer une image de conteneur légère pour les applications Java

Lors de la création d'une image Docker avec un produit Java, vous pouvez exécuter maven au moment de docker build, mais cela prend du temps et les artefacts qui ne sont pas nécessaires au moment de l'exécution sont téléchargés, donc l'image devient grande.

Par conséquent, si vous construisez avec CircleCI et créez un Dockerfile qui télécharge et exécute le Jar créé, il sera plus facile à construire et la taille de l'image sera plus petite.

Faire Uber JAR ou Zip

Pour créer un bocal qui inclut toutes les bibliothèques dépendantes, il est facile d'utiliser le bouchon d'ombrage comme suit. Il peut également s'agir d'un fichier Jar exécutable en utilisant ManifestResourceTransformer pour inclure la mainClass dans le fichier MANIFEST.

pom.xml


<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-shade-plugin</artifactId>
  <version>3.1.0</version>
  <executions>
    <execution>
      <phase>package</phase>
      <goals>
        <goal>shade</goal>
      </goals>
      <configuration>
        <transformers>
          <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
            <mainClass>xxx.Main</mainClass>
          </transformer>
        </transformers>
      </configuration>
    </execution>
  </executions>
</plugin>

Je pense que vous pouvez créer un fichier zip en utilisant le plug-in d'assemblage.

Ecrire les paramètres de circleci

CircleCI 2.0 crée un conteneur de construction en utilisant pom.xml comme clé de cache, afin que vous puissiez construire à grande vitesse à moins que vous ne réécriviez pom. De plus, le référentiel de Maven est reflété par CircleCI, le téléchargement des bibliothèques dépendantes est donc rapide.

Pour les paramètres de construction, créez .circleci / config.yml directement sous le projet. L'exemple sera affiché lorsqu'il fonctionnera avec le projet GitHub, vous pouvez donc l'utiliser tel quel, mais à la fin, ajoutez uniquement l'étape de téléchargement du fichier Uber JAR ou ZIP vers Artifact (dans l'exemple ci-dessous, à store_artifacts).

yaml:.circleci/config.yml


version: 2
jobs:
  build:
    docker:
      - image: circleci/openjdk:8-jdk
    working_directory: ~/repo
    environment:
      MAVEN_OPTS: -Xmx3200m
    steps:
      - checkout
      - restore_cache:
          keys:
          - v1-dependencies-{{ checksum "pom.xml" }}
          - v1-dependencies-
      - run: mvn dependency:go-offline
      - save_cache:
          paths:
            - ~/.m2
          key: v1-dependencies-{{ checksum "pom.xml" }}
      - run: mvn integration-test
      - store_artifacts:
          path: target/xxx-0.1.0-SNAPSHOT.jar

Faire un Dockerfie

Dans le Dockerfile, écrivez pour télécharger et exécuter cet artefact.

Dockerfile


FROM openjdk:8-alpine

RUN apk --no-cache add curl jq

RUN curl 'https://circleci.com/api/v1.1/project/github/kawasima/xxx/latest/artifacts?branch=develop&filter=successful' \
    | jq 'map(select(.["path"] == "home/circleci/repo/target/xxx-0.1.0-SNAPSHOT.jar"))' \
    | jq '.[0]["url"]' \
    | xargs curl -o xxx.jar

RUN apk del --purge curl jq

ENTRYPOINT ["java", "-jar", "xxx.jar"]

L'URL du dernier artefact de construction réussi peut être obtenue sans authentification à l'aide de l'API CircleCI v1.1 pour les référentiels publics. Nous utilisons jq pour identifier les artefacts de JSON et extraire les URL.

Recommended Posts

Comment créer une image de conteneur légère pour les applications Java
Comment créer un conteneur Java
Comment créer un référentiel Maven pour 2020
Comment créer une base de données H2 n'importe où
Comment créer des pages pour le tableau "kaminari"
Comment créer un JRE léger pour la distribution
[Docker] Comment créer un environnement virtuel pour les applications Rails et Nuxt.js
Comment créer une méthode
Comment créer un environnement Java en seulement 3 secondes
[Spring Boot] Comment créer un projet (pour les débutants)
Comment créer un URI de données (base64) en Java
Comment créer un tableau Java
Comment créer et lancer un Dockerfile pour Payara Micro
Comment créer un nouveau projet Gradle + Java + Jar dans Intellij 2016.03
Comment vérifier le contenu de la chaîne de caractères java de longueur fixe
Comment faire un diamant révolutionnaire en utilisant Java pour déclaration wwww
Comment créer un résumé de calendrier Java
[Introduction à Java] Comment écrire un programme Java
Comment créer un robot Discord (Java)
[Swift5] Comment créer un écran de démarrage
[rails] Comment créer un modèle partiel
[Java] Comment transformer un tableau à deux dimensions avec une instruction for étendue
[Java] [Pour les débutants] Comment insérer des éléments directement dans un tableau à deux dimensions
[Java] Comment tester s'il est nul dans JUnit
[Rails] Comment créer un graphique à l'aide de lazy_high_charts
Comment obtenir un heapdump à partir d'un conteneur Docker
Comment afficher une page Web en Java
Essayez de créer un babillard en Java
Comment créer une classe qui hérite des informations de classe
Comment convertir un contrat de solidité en une classe de contrat Java
[Java] Créons un Minecraft Mod 1.14.4 [Introduction]
Comment créer un thème dans Liferay 7 / DXP
[Java] Créons un Minecraft Mod 1.16.1 [Introduction]
[Java] (pour MacOS) Méthode de définition du chemin de classe
[1st] Comment créer un projet de framework Spring-MVC
Comment créer facilement un pull-down avec des rails
[Rails] Comment créer un bouton de partage Twitter
[Java] Créons un Minecraft Mod 1.14.4 [99. Mod output]
[Java] Comment rendre plusieurs boucles for uniques
Comment créer une petite image docker de l'application openjdk 11 (EA) (1 Go → 85 Mo)
[Azure] J'ai essayé de créer une application Java pour la création d'applications Web gratuites - [Débutant]
[Introduction à Docker] Créer une image Docker pour l'apprentissage automatique et utiliser le notebook Jupyter
[Java] Créer un filtre
Comment créer docker-compose
Créer une image docker pour exécuter une application Java simple
Comment utiliser un tableau pour la clé TreeMap
Comment passer d'Eclipse Java à un fichier SQL
Comment écrire un test unitaire pour Spring Boot 2
Comment déployer à partir d'une image Docker locale vers Heroku
[Java] Créons un Minecraft Mod 1.14.4 [édition supplémentaire]
[Java] Créons un Minecraft Mod 1.14.4 [7. Add progress]
java: Comment écrire une liste de types génériques [Note]
[Java] Comment sortir de Janken (équivalent à paiza rang A)
[Java] Créons un Minecraft Mod 1.14.4 [6. Ajouter une recette]
Comment créer une URL JDBC (Oracle Database, Thin)