Docker et mise a jour des dépendances

Bonjour,

J’ai installé Jeedom sur Docker et ca se passe très bien… Sauf au moment des mises à jour (fréquentes en ce moment sur le tag latest).

Je m’explique, j’ai configuré watchtower pour mettre à jour l’ensemble de mes containers, sur tous les containers ca se passe sans problème mais sur Jeedom après chaque mise a jour il faut relancer l’installation des dépendances Openzwave et Deconz. D’ou ma question : est-ce qu’on peut automatiser cette relance ?

Merci d’avance,

1 « J'aime »

Bonjour,
Je ne connais pas watchtower, est-ce que ça re-build les images docker à partir de leur Dockerfile ? Ou bien ça exécute une mise à jour spécifique par container que tu dois configurer quelque part ?
Je suppose que dans ce cas tu dois arrêter / relancer le container jeedom ? Est-ce qu’il faut aussi restaurer un backup jeedom ?

Tu ne dois pas faire de mise a jour de ton image docker ( d’ailleurs jeedom n’est pas tellement compatible avec ce type de technologie ) je te conseille d’exclure l’image de ton processus

Hello,

Pas de rebuild, ça interroge le hub pour voir si une image plus récente est disponible, ca récupère l’image et ca relance le container avec cette image et exactement les options utilisées pour le dernier lancement :

https://containrrr.dev/watchtower/

Pas besoin de restaurer un backup, par contre comme les dépendances sont installées dans le container lui meme (et pas dans /var/www/html qui est mappé en local) il faut relancer leur installation sinon que ce soit Openzwave ou Deconz ne peuvent pas se relancer.

Est-ce que je pourrais appeler un script (en post-update, watchtower a l’option) pour réinstaller toutes les dépendances ?

Ha oui, tu utilise l’image officielle, mais dans ce cas tu a mis la bdd de jeedom dans un container distinct ? Ou sinon ça doit te la ré installer vide à chaque mise à jour ?

En tout cas, oui ce genre de script d’update serait faisable, il suffit à mon avis de lancer les scripts d’install de chaque plugin (pour openzwave c’est le script /resources/install_apt.sh, pour l’autre plugin je ne sais pas) Mais chaque plugin fait ce qu’il veut, il n’y a pas de norme pour le script d’install - s’il existe.
Et puis, à chaque nouveau plugin que tu installe tu devrais maintenir ton script, ce n’est pas optimal.

La BDD est dans le meme container mais elle est aussi sur un volume local :

    volumes:
      - /home/docker/Jeedom/data/html:/var/www/html
      - /home/docker/Jeedom/data/db:/var/lib/mysql

Donc il retrouve ses petits au redémarrage

Je vais creuser pour un script a appeler en post update avec les différentes installations, effectivement pas forcément optimal :slight_smile:

Une autre option serait de prendre un backup en pre-install et de le restaurer en post-install (de ce que j’ai compris ca recompile toutes les dépendances), ca serait jouable en ligne de commande ça ?

Bon, j’ai mis un script de post-update, tous les plugins officiels ont le meme script d’install :

#!/bin/bash

# Reinstalation dependances officielles
find /var/www/html/plugins -name "install_apt.sh" -exec sudo bash -x {} \;

Petite correction, j’ai remplacé « sh » par « bash » notamment pour les dépendances Openzwave.

Et dans mon docker-compose :

    labels:
      - "com.centurylinklabs.watchtower.enable=true"
      - "com.centurylinklabs.watchtower.lifecycle.post-update=/var/www/html/plugins/reinstall_deps.sh"

On va bien voir… :slight_smile:

1 « J'aime »

Bonjour,
Non le backup jeedom n’intègre pas les dépendances pour la même raison que pour l’image Docker : cela dépend de l’os et cela ne peut pas être copié / restauré.
le backup copie uniquement le…/html et la db.

Par contre le core relance les install en principe si elles ne sont plus présentes.

Ça reste foireux de faire cet update de container ainsi, rien que pour zwave il y a une install assez longue même sur une machine puissante et faire ça à chaque update, en automatique en plus: la domotique indisponible aléatoirement pendant 10 à 30 min le temps que ça reinstall le tout c’est magnifique…

1 « J'aime »

Perso, j’ai mis un scénario sur #start# et avec un bloc code qui lance la fonction dependances des plugins qui ne sont pas OK avec un container propre
Mais j’ai pas de zwave et ça lance le script que si la dépendance n’est pas déjà OK. J’ai été obliger de le faire car le coré qui doit le faire ça laissait parfois longtemps sans qu’il relance les dépendances, comme si un précédent OK était conservé sans vérification de fond

Hello @lunarok ,

Tu aurais ton bloc code pour que je regarde comment l’adapter (l’appel du script post mise à jour watchtower n’a pas l’air de faire le job) ?

Merci pour ton aide :slight_smile:

C’est ca qu’il faut mettre dedans :
xiaomihome::dependancy_install();

A faire avec tous les plugins ayant des dépendances

Et une boucle comme celle-là :

foreach(plugin::listPlugin(true) as $plugin){
  if($plugin->getHasDependency()) {
    $plugin->dependancy_install();
  }
}

Ca pourrait marcher ?

Bon, j’ai bricolé (c’est mon premier code php :blush:) et voilà ce que ca donne après quelques tests, et ca a l’air de marcher :

$scenario->setLog('Début de la reinstallation des dependances');
foreach(plugin::listPlugin(true) as $plugin){
  if($plugin->getHasDependency()) {
    $scenario->setLog($plugin->getName().' dispose de dependances, installation en cours');
    try {
      $plugin->dependancy_install();
    }
    catch (Exception $e) {
      $scenario->setLog('Erreur lors de l\'installation des dependances: '.$e->getMessage());
    }
    do {
      $dependency_info = $plugin->dependancy_info();
      if ($dependency_info['state'] == 'in_progress') {
        sleep(10);
      } 
      else {
        $scenario->setLog('Installation des dependances de '.$plugin->getName().' terminees');
        try {
      		$plugin->deamon_start();
    	}
    	catch (Exception $e) {
      		$scenario->setLog('Erreur lors du demarrage du plugin: '.$e->getMessage());
    	}
      }
    } while ($dependency_info['state'] == 'in_progress');  
  } 
}
$scenario->setLog('Fin de la réinstallation des dépendances');

Edit : ca marche quand c’est lancé en manuel mais pas quand c’est lancé au démarrage… Je sens le délai entre deux installations de dépendances (mais il devrait me balancer une exception non ?). Je continuerai mes tests demain…

Bon, j’ai ajouté une tempo et stoppé le démon et ca passe mieux

$scenario->setLog('Début du scenario de reinstallation des dependances');
foreach(plugin::listPlugin(true) as $plugin){
  if($plugin->getHasDependency()) {
    $scenario->setLog($plugin->getName().' dispose de dependances, installation en cours :');
    $plugin->deamon_stop();
    $plugin->deamon_changeAutoMode(0);
    sleep(60);
    try {
      $plugin->dependancy_install();
    }
    catch (Exception $e) {
      $scenario->setLog('Erreur lors de l\'installation des dependances: '.$e->getMessage());
    }
    do {
      $dependency_info = $plugin->dependancy_info();
      if ($dependency_info['state'] == 'in_progress') {
        sleep(10);
      } 
      else {
        $scenario->setLog('Installation des dependances de '.$plugin->getName().' terminees');
        try {
      		$plugin->deamon_start();
          	$plugin->deamon_changeAutoMode(1);
    	}
    	catch (Exception $e) {
      		$scenario->setLog('Erreur lors du demarrage du plugin: '.$e->getMessage());
    	}
      }
    } while ($dependency_info['state'] == 'in_progress');  
  } 
}
$scenario->setLog('Fin du scenario de réinstallation des dépendances');

Pas sur de moi sur le daemon_stop/daemon_start (je devrais utiliser stop/start plutot ?).

4 « J'aime »

Ce sujet a été automatiquement fermé après 24 heures suivant le dernier commentaire. Aucune réponse n’est permise dorénavant.