25
octobre 2018

Script de démarrage automatique avec Docker

Script de démarrage automatique avec Docker

Je bricole Docker pour différents services et j'ai souvent besoin de démarrer plusieurs processus lors du "boot" du container et qu'ils restent actif par la suite.

Nouvelle version du script encore plus simple

#!/bin/bash

# $1 nom du processus a chercher via ps
# $2 nom du service a demarrer
start () {
        ps aux | grep $1 | grep -q -v grep
        if [ $? -ne 0 ]; then
                service $2 restart
        fi
}

start "ssh" "ssh"
start "apache2" "apache2"
start "mysql" "mysql"

while sleep 60; do
        start "ssh" "ssh"
        start "apache2" "apache2"
        start "mysql" "mysql"
done

Du coups je me suis fais un petit script de base, il est pas forcément des plus propres mais en tout cas il marche pas trop mal.

#!/bin/bash

start () {
        if [ $2 -ne 0 ]; then
                # Necessaire pour les processus n'ayant
                # pas le meme nom que le service $1
                kill -15 $2
        else
                ps aux | grep $1 | grep -q -v grep
                if [ $? -ne 0 ]; then
                        service $1 restart
                fi
        fi
}

start "ssh" "0"
start "cron" "0"
start "apache2" "0"
start "mysql" "0"
start "php7.1-fpm" "0"

PID_DIR="/var/run/elasticsearch"
PID_NAME=elasticsearch
PID_NUMBER=`cat $PID_DIR/$PID_NAME.pid`
start "elasticsearch" $PID_NUMBER

while sleep 60; do
        start "ssh" "0"
        start "cron" "0"
        start "apache2" "0"
        start "mysql" "0"
        start "php7.1-fpm" "0"

        PID_DIR="/var/run/elasticsearch"
        PID_NAME=elasticsearch
        PID_NUMBER=`cat $PID_DIR/$PID_NAME.pid`
        start "elasticsearch" $PID_NUMBER
done

La fonction start() s'occupe de contrôler l'existance d'un processus $1 ou $2. Suivant le cas elle le tue (si $2 est renseigné) et elle le lance si il n'existe pas.

start "ssh" "0"
start "cron" "0"
start "apache2" "0"
start "mysql" "0"
start "php7.1-fpm" "0"

PID_DIR="/var/run/elasticsearch"
PID_NAME=elasticsearch
PID_NUMBER=`cat $PID_DIR/$PID_NAME.pid`
start "elasticsearch" $PID_NUMBER

Appel de la fonction avec le service à démarrer. Le service doit porter le même nom ou contenir le nom pour à la fois servir au grep et à la commande service. Par exemple pour ssh, le nom du processus est sshd mais pour le lancer c'est la commande

service ssh restart

Par chance ils ont un point commun dans leurs nom : ssh. Dans le cas d'un nom de processus différent de celui du service il va falloir passer par le pid. C'est ce que je fais pour elasticsearch

Ensuite il faut maintenir tout ce petit monde en fonction, C'est cette boucle qui se lance toute les 60 secondes qui en a la charge.

while sleep 60; do
        start "ssh" "0"
        start "cron" "0"
        start "apache2" "0"
        start "mysql" "0"
        start "php7.1-fpm" "0"

        PID_DIR="/var/run/elasticsearch"
        PID_NAME=elasticsearch
        PID_NUMBER=`cat $PID_DIR/$PID_NAME.pid`
        start "elasticsearch"  $PID_NUMBER
done

C'est pas forcément le plus propre et d'ailleurs si vous avez mieux je prends.

Administrateur système de métier mais surtout curieux de découvrir de nouvelles technos très orientées DIY. A mes heures perdues je fais de la photo avec toujours une petite envie d'intégrer des DIY sous forme de timelaps à base de raspberry.

2 commentaires

mhoungbo a dit

Bonjour à toi

pourquoi ne pas fait simple avec un docker-compose
avec l'option restart: always ?

Répondre

Philippe Maladjian a dit

Bonjour, pour moi restart: always est pour faire en sorte que le container redémarre automatiquement en cas de coupure du serveur.

Ce script de démarrage est à inclure dans un container pour démarrer des programmes au lancement de celui-ci, un peu comme un system-d le ferait.

Répondre

Écrire un commentaire

Quelle est la troisième lettre du mot kled ? :

Script de démarrage automatique avec Docker - Philippe Maladjian - Péripéties bucoliques d'un administrateur systèmes au royaume de la virtualisation, du stockage et accessoirement photographe à ses heures perdues