Hotdog est un ensemble de hooks OCI utilisés pour injecter le Hot Patch Log4j dans des conteneurs.
Lorsque runc configure le conteneur, il appelle hotdog-cc-hook
. hotdog-cc-hook
bind-monte les fichiers hotpatch dans le système de fichiers du conteneur à l' /dev/shm/.hotdog
. Une fois le processus du conteneur principal démarré, runc appelle hotdog-poststart-hook
, qui utilise nsenter
pour entrer dans les espaces de noms du conteneur et lancer un processus hotdog-hotpatch
. hotdog-hotpatch
s'exécute plusieurs fois avec une fréquence décroissante (actuellement 1 s, 5 s, 10 s, 30 s) pour détecter et patcher à chaud les JVM à l'intérieur du conteneur.
hotdog-hotpatch
, ils ne seront pas patchés à chaud.hotdog-hotpatch
peut rester pendant une courte période après la sortie du conteneur./dev/shm/.hotdog
à l'intérieur du conteneur. Si /dev/shm
n'existe pas (comme dans le cas des conteneurs Docker lancés avec --ipc=none
), hotdog ne sera pas injecté dans le conteneur et ne fournira pas de hotpatching. Hotdog est inclus par défaut dans Bottlerocket 1.5.0.
Le hotpatching peut être activé pour les nouveaux lancements de Bottlerocket en incluant les paramètres suivants dans les données utilisateur.
[ settings . oci-hooks ]
log4j-hotpatch-enabled = true
Pour les hôtes existants exécutant la dernière version de Bottlerocket, le hotpatching peut être activé à l'aide du client API.
apiclient set oci-hooks.log4j-hotpatch-enabled=true
L'activation du paramètre au moment de l'exécution n'a aucun effet sur l'exécution des conteneurs. Les conteneurs nouvellement lancés seront hotpatchés.
Pour installer Hotdog, vous devez copier les fichiers suivants au bon emplacement et définir la configuration appropriée.
Log4jHotPatch.jar
dans /usr/share/hotdog
(si vous créez le hotpatch à partir des sources, vous le trouverez dans build/libs
)make && sudo make install
pour installer hotdog-cc-hook
et hotdog-poststart-hook
dans /usr/libexec/hotdog
et hotdog-hotpatch
dans /usr/share/hotdog
oci-add-hooks
oci-add-hooks
avec les hooks hotdog en écrivant le contenu suivant dans /etc/hotdog/config.json
: {
"hooks" : {
"prestart" : [{
"path" : " /usr/libexec/hotdog/hotdog-cc-hook "
}],
"poststart" : [{
"path" : " /usr/libexec/hotdog/hotdog-poststart-hook "
}]
}
}
/etc/docker/daemon.json
: {
"runtimes" : {
"hotdog" : {
"path" : " oci-add-hooks " ,
"runtimeArgs" : [
" --hook-config-path " , " /etc/hotdog/config.json " ,
" --runtime-path " , " /usr/sbin/runc "
]
}
}
}
Pour exécuter un conteneur avec le hotpatching activé, spécifiez docker run --runtime hotdog
. Pour exécuter avec le hotpatching activé par défaut dans tous les conteneurs, ajoutez le contenu suivant à /etc/docker/daemon.json
:
"default-runtime": "hotdog"
Si vous souhaitez désactiver hotdog
même lorsqu'il est activé par défaut, spécifiez --runtime runc
.
hotdog
ajoutera plusieurs fichiers au répertoire /dev/shm/.hotdog
dans chaque conteneur. Vous pouvez trouver le journal de hotdog-hotpatch
dans /dev/shm/hotdog.log
.
Voir CONTRIBUTION pour plus d'informations.
Ce projet est sous licence Apache-2.0.