Heroku + Docker + Spring Boot

Ce qui suit se concentrera sur mon expérience de l'exécution de l'application Dockerized Spring Boot sur les machines virtuelles gratuites du service cloud Heroku . L'un des principaux avantages de ce fournisseur est qu'il permet de créer des machines virtuelles gratuites avec une limitation des heures de fonctionnement, et pour cela, seul l'enregistrement est suffisant. Même les détails de paiement ne doivent pas être confirmés, mais si vous les confirmez, vous pouvez obtenir des bonus supplémentaires. Vous pouvez en savoir plus sur leur prix ici . De mon point de vue, leur politique concernant les ressources gratuites n'a presque pas d'analogue.

Et donc, après avoir créé une application sur Heroku, il existe plusieurs façons d'y déployer votre code

  • valider dans le référentiel heroku git
  • lier l'application au référentiel github
  • en utilisant un conteneur docker

Ensuite, nous considérerons la dernière de ces méthodes. Pour continuer, nous aurons besoin des applications suivantes


Le dernier de ces outils nous donnera l'opportunité d'effectuer toutes les opérations de travail avec le cloud depuis la ligne de commande.

Nous commençons par créer une application Spring Boot via Spring Initializr . En tant que dépendances, ajoutez Spring Web Starter. Cela devrait suffire.

Dans le même package dans lequel se trouve la classe principale de l'application, nous ajoutons la classe la plus simple du contrôleur REST afin que l'application montre en quelque sorte des signes de vie.

@RestController public class DemoController { @GetMapping("/check") public String check() { return "Application is alive"; } } 

Ajouter au fichier application.properties

 server.port=${PORT:8080} 

Ce paramètre est essentiel pour exécuter le conteneur sur Heroku. Le fait est que dans le réseau interne du service, l'application est lancée sur un port libre au moment du lancement, dont le nombre est transmis via la variable d'environnement PORT. De plus, l'application doit avoir le temps de se connecter à ce port dans les 60 premières secondes après le lancement, sinon elle s'arrêtera.

Dans la section plugins du fichier pom.xml , nous ajoutons le plugin dockerfile de Spotify, qui nous aidera à assembler l'image docker de notre application.

 <plugin> <groupId>com.spotify</groupId> <artifactId>dockerfile-maven-plugin</artifactId> <version>1.4.6</version> <executions> <execution> <id>default</id> <goals> <goal>build</goal> <goal>push</goal> </goals> </execution> </executions> <configuration> <repository>registry.heroku.com/${project.artifactId}/web</repository> <tag>latest</tag> <buildArgs> <JAR_FILE>${project.build.finalName}.jar</JAR_FILE> </buildArgs> </configuration> </plugin> 

Une telle configuration de plug-in commencera à créer l'image en tant que partie de la cible d'installation et poussera l'image dans le référentiel Docker Heroku en tant que partie de la cible de déploiement. Soit dit en passant, pour pouvoir exécuter maven deploy, vous devez désactiver le déploiement du fichier jar collecté (nous n'avons pas besoin de le télécharger n'importe où). Vous pouvez le faire en utilisant l'option maven.deploy.skip dans la section des propriétés du fichier pom.xml.

 <properties> <java.version>1.8</java.version> <maven.deploy.skip>true</maven.deploy.skip> </properties> 

Ensuite, créez un Dockerfile dans le dossier racine du projet (à côté de pom.xml)

 FROM openjdk:8-jdk-alpine ARG JAR_FILE RUN mkdir -p /apps COPY ./target/${JAR_FILE} /apps/app.jar COPY ./entrypoint.sh /apps/entrypoint.sh RUN chmod +x /apps/entrypoint.sh CMD ["/apps/entrypoint.sh"] 

Comme vous pouvez le voir, nous passons ici le nom du fichier jar assemblé comme argument à l'assembly (ARG JAR_FILE). La valeur de cet argument est définie dans les paramètres du plugin maven.

Le script entrypoint.sh sera également placé à la racine du projet et ce sera très simple.

 #!/usr/bin/env sh /usr/bin/java -XX:+UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap -Xmx256m -Xss512k -XX:MetaspaceSize=100m -jar /apps/app.jar 

Faites attention aux paramètres JVM limitant la mémoire, et en particulier aux deux premiers paramètres. Ils incluent un mode de gestion de mémoire spécial, qui est nécessaire lorsqu'une application java est lancée à l'intérieur du conteneur Docker. La mémoire disponible pour l'application sur les machines Heroku gratuites est limitée à 512 Mo. Le dépassement de cette limite mettra fin à l'application. Si vous souhaitez utiliser Java 9+, les deux premières options doivent être remplacées par une -XX: + UseContainerSupport . Vous pouvez en lire plus ici . Il semble également que la prise en charge des conteneurs ait cessé d'être une fonctionnalité expérimentale dans Java 8. Détails ici.

Après avoir terminé ces étapes, essayez de démarrer
 mvnw clean install 

Si tout est fait correctement, alors l'application et l'image docker pour cela devraient se construire. Vous pouvez vérifier si l'image a été créée à l'aide de la commande
 docker images 

Maintenant, configurons le cloud et utilisons la CLI Heroku déjà mentionnée pour cela. Bien sûr, pour terminer ces étapes, vous devrez créer un compte sur Heroku.

Tout d'abord, nous devons nous connecter. Pour ce faire, exécutez la commande
 heroku login 
et suivez les instructions ci-dessous.

Après cela, vous devez vous connecter au référentiel heroku Docker. Pour ce faire, exécutez la commande
 heroku container:login 
sans cela, nous ne pouvons pas pousser notre image de docker.

Ensuite, nous créons l'application en utilisant la commande
 heroku apps:create <app-name> 

Veuillez noter que le nom de l'application doit correspondre au nom de l'artefact spécifié dans pom.xml . Ici, vous devrez peut-être passer un peu de temps à sélectionner le nom de l'application, qui n'est toujours occupé par personne.

Une fois l'application créée, exécutez
 mvnw clean deploy 

et attendez que l'application soit créée et poussez l'image docker pour qu'elle se produise. Veuillez noter que l'envoi n'est possible que si le nom de l'image correspond au modèle Registry.heroku.com/<app-name>/web et qu'une application portant le nom <app-name> a été créée. Si vous regardez les paramètres du plugin maven, vous verrez que tout se fait exactement comme ça.

La dernière étape pour le déploiement et le lancement de l'image est la commande
 heroku container:release web --app=<app-name> 

Après cela, suivez le lien https: // <nom-app> .herokuapp.com / check et après un certain temps, vous verrez le texte qui sera affiché par le gestionnaire du contrôleur.

Une autre façon d'ouvrir une application en cours d'exécution dans un navigateur est d'utiliser la commande
 heroku open --app=<app-name> 

Si quelque chose ne fonctionne pas, les journaux peuvent être affichés dans l'interface Web Heroku ou avec la commande
 heroku logs 

C’est tout! J'espère que ce guide vous a été utile!

Quelques liens utiles


1. Documentation Heroku CLI devcenter.heroku.com/categories/command-line
2. A propos des fonctionnalités de gestion de la mémoire dans le devcenter Java dockerized.heroku.com/articles/java-memory-issues
3. devcenter.heroku.com/categories/deploying-with-docker
4. Un exemple d'application Java de Heroku. Il existe une méthode de déploiement différente, mais il est utile de consulter github.com/heroku/java-getting-started
5. Guide de Heroku pour lancer une application Java (pas via Docker) devcenter.heroku.com/articles/getting-started-with-java?singlepage=true
6. Bon matériel sur l'utilisation de Java sur Docker habr.com/en/company/hh/blog/450954
7. À propos des options de lancement de Java dans les conteneurs Docker www.oracle.com/technetwork/java/javase/8u191-relnotes-5032181.html#JDK-8146115

Source: https://habr.com/ru/post/fr459472/


All Articles