Il s'avère que docker kill
signifie tuer dans le sens de "le rendre mort", par opposition au sens POSIX de "envoyer un signal".
Nous avons plusieurs conteneurs auxquels nous devons envoyer un SIGHUP
afin de recharger la configuration, mais cela les empêche d'appliquer leur politique de redémarrage automatique "always", ce qui n'est pas ce que nous voulons.
Quelle est la meilleure façon d'envoyer des signaux à ces conteneurs sans affecter leur capacité de redémarrage automatique ?
Pour mieux illustrer le problème que nous rencontrons, prenons l'exemple suivant.
Nous avons un conteneur dont la politique de redémarrage est définie sur always
$ docker inspect cloudwatch-exporter | jq .[].HostConfig.RestartPolicy
{
"Name": "always",
"MaximumRetryCount": 0
}
Nous rechargeons la configuration à un moment donné en utilisant docker kill
:
$ docker kill --signal=SIGHUP cloudwatch-exporter
cloudwatch-exporter
Quelque temps plus tard, quelque chose se produit qui arrête le processus. Pour simuler cela, j'enverrai un signal à l'intérieur du conteneur :
$ docker exec cloudwatch-exporter bash -c "kill 1"
À ce stade, le conteneur est mort et ne redémarrera pas :
$ docker ps -a | grep cloudwatch-exporter
c7827204bba5 prom/cloudwatch-exporter:cloudwatch_exporter-0.8.0 "java -jar /cloudwat…" Il y a 20 heures Exited (143) il y a 3 minutes cloudwatch-exporter
Quelles alternatives avons-nous à l'utilisation de docker kill
? Dans de nombreuses situations, docker exec
fonctionne, mais cela ne fonctionnera pas pour tout conteneur qui contient uniquement un binaire statiquement lié.