Hotdog 是一组 OCI 挂钩,用于将 Log4j 热补丁注入到容器中。
当 runc 设置容器时,它会调用hotdog-cc-hook
。 hotdog-cc-hook
将热补丁文件绑定安装到容器的文件系统/dev/shm/.hotdog
中。主容器进程启动后, runc 调用hotdog-poststart-hook
,它使用nsenter
进入容器的命名空间并分叉出hotdog-hotpatch
进程。 hotdog-hotpatch
以逐渐降低的频率(当前为 1 秒、5 秒、10 秒、30 秒)运行多次,以检测和修补容器内的 JVM。
hotdog-hotpatch
进程退出后启动新的Java进程,则不会对其进行热补丁。hotdog-hotpatch
可能会在容器退出后保留一小段时间。/dev/shm/.hotdog
中。如果/dev/shm
不存在(例如使用--ipc=none
启动 Docker 容器的情况),hotdog 将不会注入到容器中,也不会提供热补丁。 Hotdog 默认包含在 Bottlerocket 1.5.0 中。
通过在用户数据中包含以下设置,可以为新启动的 Bottlerocket 启用热补丁。
[ settings . oci-hooks ]
log4j-hotpatch-enabled = true
对于运行最新版本 Bottlerocket 的现有主机,可以使用 API 客户端启用热补丁。
apiclient set oci-hooks.log4j-hotpatch-enabled=true
在运行时启用该设置对运行容器没有影响。新推出的容器将进行热补丁。
要安装Hotdog,您需要将以下文件复制到正确的位置并设置适当的配置。
Log4jHotPatch.jar
复制到/usr/share/hotdog
(如果您从源代码构建热补丁,您将在build/libs
中找到它)make && sudo make install
将hotdog-cc-hook
和hotdog-poststart-hook
安装到/usr/libexec/hotdog
并将hotdog-hotpatch
安装到/usr/share/hotdog
oci-add-hooks
/etc/hotdog/config.json
来使用 hotdog 挂钩配置oci-add-hooks
: {
"hooks" : {
"prestart" : [{
"path" : " /usr/libexec/hotdog/hotdog-cc-hook "
}],
"poststart" : [{
"path" : " /usr/libexec/hotdog/hotdog-poststart-hook "
}]
}
}
/etc/docker/daemon.json
来配置 Docker 使用挂钩: {
"runtimes" : {
"hotdog" : {
"path" : " oci-add-hooks " ,
"runtimeArgs" : [
" --hook-config-path " , " /etc/hotdog/config.json " ,
" --runtime-path " , " /usr/sbin/runc "
]
}
}
}
要运行启用了热补丁的容器,请指定docker run --runtime hotdog
。要在所有容器中默认启用热补丁运行,请将以下内容添加到/etc/docker/daemon.json
:
"default-runtime": "hotdog"
如果您希望选择退出hotdog
即使默认情况下已启用),请指定--runtime runc
。
hotdog
会将多个文件添加到每个容器中的/dev/shm/.hotdog
目录中。您可以在/dev/shm/hotdog.log
中找到hotdog-hotpatch
的日志。
请参阅贡献以获取更多信息。
该项目根据 Apache-2.0 许可证获得许可。