[Tutoriel] WUD - Nouvelle image docker disponible?

Bonjour,

Le contexte : j’utilise de plus en plus docker (en dehors de Jeedom) et je voulais un moyen simple de savoir si une image plus récente était disponible mais sans rentrer dans quelque chose d’automatique. Je préfère être informé et faire la manipulation par moi même quand je le souhaite. C’est plus sécurisant (un backup avant par exemple), ça évite d’oublier comment ça marche et c’est plus amusant !

J’ai trouvé une image docker qui permet assez rapidement de sortir ce que l’on veut et qui est interrogeable via une API : WUD [ What’s up docker?)

On peut surement faire la même chose avec watchtower mais bref j’ai utilisé WUD histoire d’avoir l’info dans Jeedom, évidemment :grin:

Je ne détaille pas trop et notamment la partie concernant docker puisque je présume que si vous avez du docker vous savez un peu manipuler dessus.

:information_source: Vous devriez en avoir grosso-modo pour 20 minutes

:triangular_flag_on_post: Au moment d’installer WUD sur votre docker il faudra définir un login/password. Le mot de passe est à indiquer sous la forme d’un hachage MD5 mais il est à transformer (étape 2)

Lorsque WUD est démarré il sera accessible sur le port 3000 : http://ip_docker:3000

Les grandes étapes :

  1. Générer le mot de passe depuis une machine linux : openssl passwd -apr1
  2. Transformer la chaine obtenue en ajoutant le signe $ devant chaque $
    Exemple : $gthe$5hQa devient donc $$gthe$$5hQa
  3. Créer votre docker, par exemple depuis une stack Portainer en remplaçant VOTRE_LOGIN_A_CHANGER par le login que vous voulez et VOTRE_MOT_DE_PASSE_A_CHANGER par le mot de passe issue de l’étape précédente

Voici le fichier docker_compose :

services:
  whatsupdocker:
    image: getwud/wud
    container_name: wud
    environment:
      - WUD_WATCHER_LOCAL_CRON=0 6 * * *
      - WUD_AUTH_BASIC_MY_USER=VOTRE_LOGIN_A_CHANGER
      - WUD_AUTH_BASIC_MY_HASH=VOTRE_MOT_DE_PASSE_A_CHANGER
    ports:
      - 3000:3000
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock

Celui-ci fera une vérification à 6h tous les jours
4. Créer un équipement virtuel dans Jeedom avec une commande information / autre que l’on appelera par exemple « updateAvailable »
5. Créer un scénario qui s’éxécute par exemple à 7h tous les jours et avec un bloc code (cliquer sur « Résumé » un peu plus bas pour l’afficher) puis modifier :
5.a $url par l’adresse de votre WUD
5.b $login par ce que vous avez choisi pour VOTRE_LOGIN_A_CHANGER
5.c $password par ce que vous avez choisi pour VOTRE_MOT_DE_PASSE_A_CHANGER
5.d $separateur par le séparateur qui viendra séparer les noms des images dans la commande virtuelle
5.e $commande par le nom complet de la commande virtuelle crée au point 4

Résumé
# Interrogation WUD (What's up Docker?) pour mise à jour d'une commande virtuelle si une nouvelle image docker est disponible
$url = "http://10.0.1.150:3000/api/containers";
$login = 'admin';
$password = 'Bison334';
$separateur = ',';
$commande = '#[Organisation][WUD docker updateAvailable][updateAvailable]#';

$ch = curl_init($url);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
curl_setopt($ch, CURLOPT_USERPWD, "$login:$password");
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);

$content = curl_exec($ch);
$httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);  
curl_close($ch);

$updateAvailable = '';

if ($httpcode == 200) {
  $scenario->setLog('$content : '.$content);
  $array = json_decode($content);
  if ($array === null) {
	echo "Error de décodage JSON";
  } else {
    
    foreach ($array as $arr) {
      	if ($arr->updateAvailable == 1) {
    		$scenario->setLog($arr->name);
      		$scenario->setLog($arr->updateAvailable);
          	$updateAvailable .= $arr->name . $separateur;
        }
    }
  }
} else {
  $scenario->setLog('Erreur durant la connexion à WUD : '.$httpcode);
}

if ($updateAvailable != '') {
  $updateAvailable = rtrim($updateAvailable,$separateur);
  cmd::byString($commande)->event($updateAvailable);
}
  1. Exploiter la commande virtuelle updateAvailable comme vous voulez pour avertir qu’il y a une nouvelle image de disponible (un scénario qui se lance sur changement de la commande par exemple)

Compléments :

L’adresse de l’outil : WUD

J’ai indiqué en préambule que mon but était uniquement d’être prévenu mais il est tout à fait possible de lancer des mises à jour automatiquement, sur l’ensemble ou juste les images de son choix. Il y a aussi des triggers pour déclencher des alertes mais j’ai trouvé plus simple de passer par l’API pour avoir l’info dans Jeedom

2 « J'aime »

Merci pour le partage

Dans le même genre il existe aussi diun qui ne fait que de la prévenance ( pas de maj)

1 « J'aime »

Merci pour le tutoriel, bien utile.

C’est juste dommage d’avoir une image aussi grosse pour une telle fonction.

J’ai essayé Diun qui est plus léger, mais apparemment il ne fait une notification qu’une seule fois, impossible de récupérer un « état », ou alors je n’ai pas trouvé.

Merci pour le partage Bison.

Pour ma part, j’ai choisi d’être toujour à jour avec watchtower.

Hormis la première fois où mon Nextcloud s’est mis à jour avec un trop gros gap entre version (j’avais 2 ans de retard …), et ou j’ai du corriger à la main ; sinon je n’ai jamais eu de problèmes.

Si jamais tu as un container que tu ne veux pas mettre à jour, il faut fixer la version dans le docker-compose et remplacer latest par la version souhaitée

en bonus, après chaque mise à jour, j’ai une notification qui part sur mon Discord pour me tenir informé de ce qui a été mis à jour :

cat docker-compose.yml
---
services:
 watchtower:
    container_name: watchtower
    hostname: watchtower
    image: containrrr/watchtower
    restart: always
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    environment:
      TZ: "Europe/Paris"
      WATCHTOWER_CLEANUP: "true"
      WATCHTOWER_NOTIFICATIONS: "slack"
      WATCHTOWER_NOTIFICATION_SLACK_HOOK_URL: "https://discord.com/api/webhooks/                                                                          ***********************/********************************/slack"
      WATCHTOWER_NOTIFICATION_SLACK_IDENTIFIER: "Watchtower"

Mais je comprends aussi ton point de vue sur les non auto-upgrade !

Longue vie à docker et compose :wink:

1 « J'aime »