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 許可證獲得許可。