Hotdog은 Log4j 핫 패치를 컨테이너에 삽입하는 데 사용되는 OCI 후크 세트입니다.
runc가 컨테이너를 설정할 때 hotdog-cc-hook
호출합니다. hotdog-cc-hook
핫패치 파일을 /dev/shm/.hotdog
에 있는 컨테이너의 파일 시스템에 바인드 마운트합니다. 기본 컨테이너 프로세스가 시작된 후 runc는 nsenter
사용하여 컨테이너의 네임스페이스를 입력하고 hotdog-hotpatch
프로세스를 분기하는 hotdog-poststart-hook
호출합니다. hotdog-hotpatch
컨테이너 내부의 JVM을 감지하고 핫패치하기 위해 빈도를 낮추면서(현재 1초, 5초, 10초, 30초) 여러 번 실행됩니다.
hotdog-hotpatch
프로세스가 종료된 후 새 Java 프로세스가 시작되면 핫 패치가 적용되지 않습니다.hotdog-hotpatch
컨테이너가 종료된 후에도 잠시 동안 남아 있을 수 있습니다./dev/shm/.hotdog
에 주입합니다. /dev/shm
존재하지 않는 경우(예: --ipc=none
으로 시작된 Docker 컨테이너의 경우) 핫도그는 컨테이너에 주입되지 않으며 핫패칭을 제공하지 않습니다. Hotdog은 Bottlerocket 1.5.0에 기본적으로 포함되어 있습니다.
사용자 데이터에 다음 설정을 포함하면 Bottlerocket을 새로 시작할 때 핫패칭을 활성화할 수 있습니다.
[ settings . oci-hooks ]
log4j-hotpatch-enabled = true
최신 버전의 Bottlerocket을 실행하는 기존 호스트의 경우 API 클라이언트를 사용하여 핫패칭을 활성화할 수 있습니다.
apiclient set oci-hooks.log4j-hotpatch-enabled=true
런타임 시 설정을 활성화해도 컨테이너 실행에는 영향을 미치지 않습니다. 새로 출시된 컨테이너에는 핫패치가 적용됩니다.
핫도그를 설치하려면 다음 파일을 올바른 위치에 복사하고 적절한 구성을 설정해야 합니다.
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
에 다음 내용을 작성하여 핫도그 후크로 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 라이선스에 따라 라이선스가 부여됩니다.