Hotdog คือชุดตะขอ OCI ที่ใช้ในการฉีด Log4j Hot Patch ลงในคอนเทนเนอร์
เมื่อ runc ตั้งค่าคอนเทนเนอร์ มันจะเรียกใช้ hotdog-cc-hook
hotdog-cc-hook
ผูกไฟล์ hotpatch เข้ากับระบบไฟล์ของคอนเทนเนอร์ที่ /dev/shm/.hotdog
หลังจากที่กระบวนการคอนเทนเนอร์หลักเริ่มต้นขึ้น runc จะเรียกใช้ hotdog-poststart-hook
ซึ่งใช้ nsenter
เพื่อป้อนเนมสเปซของคอนเทนเนอร์และแยกกระบวนการ hotdog-hotpatch
ออก hotdog-hotpatch
ทำงานหลายครั้งโดยมีความถี่ลดลง (ปัจจุบันคือ 1s, 5s, 10s, 30s) เพื่อตรวจจับและ hotpatch JVM ภายในคอนเทนเนอร์
hotdog-hotpatch
แล้วจะไม่มีการแพทช์ร้อนhotdog-hotpatch
อาจคงอยู่ในช่วงเวลาสั้นๆ หลังจากที่คอนเทนเนอร์ออกจากระบบ/dev/shm/.hotdog
ภายในคอนเทนเนอร์ หากไม่มี /dev/shm
(เช่นในกรณีของคอนเทนเนอร์ Docker ที่เรียกใช้ด้วย --ipc=none
) ฮอทด็อกจะไม่ถูกฉีดเข้าไปในคอนเทนเนอร์และจะไม่จัดให้มีการแพตช์ร้อน Hotdog ถูกรวมไว้ใน Bottlerocket 1.5.0 เป็นค่าเริ่มต้น
สามารถเปิดใช้งาน Hotpatching สำหรับการเปิดตัว Bottlerocket ใหม่โดยรวมการตั้งค่าต่อไปนี้ในข้อมูลผู้ใช้
[ settings . oci-hooks ]
log4j-hotpatch-enabled = true
สำหรับโฮสต์ที่มีอยู่ซึ่งใช้งาน Bottlerocket เวอร์ชันล่าสุด สามารถเปิดใช้งานการแก้ไขด่วนได้โดยใช้ไคลเอ็นต์ API
apiclient set oci-hooks.log4j-hotpatch-enabled=true
การเปิดใช้การตั้งค่าขณะรันไทม์จะไม่ส่งผลต่อการเรียกใช้คอนเทนเนอร์ คอนเทนเนอร์ที่เพิ่งเปิดตัวใหม่จะถูกแพตช์ด่วน
ในการติดตั้ง Hotdog คุณต้องคัดลอกไฟล์ต่อไปนี้ไปยังตำแหน่งที่ถูกต้องและตั้งค่าการกำหนดค่าที่เหมาะสม
Log4jHotPatch.jar
ไปที่ /usr/share/hotdog
(หากคุณสร้าง hotpatch จากแหล่งที่มา คุณจะพบมันใน build/libs
)make && sudo make install
เพื่อติดตั้ง hotdog-cc-hook
และ hotdog-poststart-hook
ไปที่ /usr/libexec/hotdog
และ hotdog-hotpatch
ไปที่ /usr/share/hotdog
oci-add-hooks
oci-add-hooks
ด้วย hotdog hooks โดยการเขียนเนื้อหาต่อไปนี้ไปที่ /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 "
]
}
}
}
หากต้องการเรียกใช้คอนเทนเนอร์โดยเปิดใช้งาน Hotpatching ให้ระบุ docker run --runtime hotdog
หากต้องการรันโดยเปิดใช้งาน hotpatching ตามค่าเริ่มต้นในคอนเทนเนอร์ทั้งหมด ให้เพิ่มเนื้อหาต่อไปนี้ใน /etc/docker/daemon.json
:
"default-runtime": "hotdog"
หากคุณต้องการเลือกไม่ใช้ hotdog
แม้ว่าจะเปิดใช้งานตามค่าเริ่มต้นแล้วก็ตาม ให้ระบุ --runtime runc
hotdog
จะเพิ่มไฟล์หลายไฟล์ลงในไดเร็กทอรี /dev/shm/.hotdog
ในแต่ละคอนเทนเนอร์ คุณสามารถค้นหาบันทึกได้จาก hotdog-hotpatch
ใน /dev/shm/hotdog.log
ดูการมีส่วนร่วมสำหรับข้อมูลเพิ่มเติม
โครงการนี้ได้รับอนุญาตภายใต้ใบอนุญาต Apache-2.0