重要
阅读nuclio源码,分析nuclio平台中java由源码到服务启动的全过程。
环境说明
nuclio: 1.4.17
kubernetes: 1.15.3
源码: 构建过程
有nuctl的build command往下查看调用
pkg/nuctl/command/build.go文件下,newBuildCommandeer函数内部调用了rootCommandeer.platform.CreateFunctionBuild走platform接口
pkg/platform/platform.go,因为platform类型为kube,所以调用pkg/platform/kube/platform.go。其中kube的NewPlatform继承了
pkg/platform/abstract/platform.go的实例,CreateFunctionBuild就在abstract/中具体定义的。pkg/platform/abstract/platform.go文件下,CreateFunctionBuild函数内部,实例化了一个builder,并执行builder.Build函数。pkg/processor/build/builder.go文件下:Build函数调用buildProcessorImage函数buildProcessorImage函数调用createProcessorDockerfile函数createProcessorDockerfile函数调用getRuntimeProcessorDockerfileInfo函数getRuntimeProcessorDockerfileInfo函数调用resolveProcessorDockerfileInfo函数resolveProcessorDockerfileInfo函数调用runtime.GetProcessorDockerfileInfo函数走runtime接口
pkg/processor/build/runtime/runtime.go,因为runtime类型为
java,所以调用pkg/processor/build/runtime/java/runtime.go。pkg/processor/build/runtime/java/runtime.go中,有具体的GetProcessorDockerfileInfo定义(包含onbuild信息)。
resolveProcessorDockerfileInfo函数调用GenerateDockerfileContents函数GenerateDockerfileContents函数调用platform.GetOnbuildStages函数platform接口
pkg/platform/platform.go,GetOnbuildStages具体定义在pkg/platform/abstract/platform.go。pkg/platform/abstract/platform.go文件下:GetOnbuildStages函数内部调用ContainerBuilder.GetOnbuildStages函数。BuilderPusher接口
pkg/containerimagebuilderpusher/containerimagebuilder.go,因为kind为
kaniko,所以调用pkg/containerimagebuilderpusher/kaniko.gopkg/containerimagebuilderpusher/kaniko.go文件下:GetOnbuildStages函数主要做以下操作
将
onbuildArtifacts转换为"FROM %s(artifact.Image) AS %s(artifact.Name)" \n ARG NUCLIO_LABEL \n ARG NUCLIO_ARCH
GenerateDockerfileContents函数调用platform.TransformOnbuildArtifactPaths函数platform接口
pkg/platform/platform.go,GetOnbuildStages具体定义在pkg/platform/abstract/platform.go。TransformOnbuildArtifactPaths函数内部调用ContainerBuilder.GetOnbuildStages函数。BuilderPusher接口
pkg/containerimagebuilderpusher/containerimagebuilder.go,TransformOnbuildArtifactPaths具体定义在pkg/containerimagebuilderpusher/kaniko.gopkg/containerimagebuilderpusher/kaniko.go文件下:TransformOnbuildArtifactPaths函数主要做以下操作将
onbuildArtifacts转换为--from=%s(artifact.Name) %s(artifat.Path[x])
从后向前推,构建function函数最终镜像的Dockerfile在pkg/processor/build/builder.go, 函数GenerateDockerfileContents。
内容如下:
| |
b.platform.GetOnbuildStages(onbuildArtifacts)调用了platform接口下的功能。
platform说明如下:
pkg\platform\platform.go中定义接口pkg\platform\types.go中定义数据结构pkg\platform\factory\factory.go为工厂函数,根据platform参数local: 调用pkg\platform\local\platform.go中的NewPlatform创建platform 实例kube: 调用pkg\platform\kube\platform.go中的NewPlatform创建platform 实例
pkg\platform\abstract\platform.go为具体创建platform实例的。被local和kube下的NewPlatform调用。
| |
根据上面说明,函数执行了kube/下的platform.go,之后调用abstract/platform.go下的
函数GetProcessorDockerfileInfo, pkg/processor/build/runtime/目录下,java/runtime.go
| |
调用关系
createProcessorDockerfile:- 调用
getRuntimeProcessorDockerfileInfo函数,生成content和DockerfilePath
- 调用
getRuntimeProcessorDockerfileInfo函数:
- 调用
resolveProcessorDockerfileInfo函数收集processor的dockerfile信息 - 获取用户输入的指令
FunctionConfig.Spec.Build.Directives,如果设置了command参数,则获取FunctionConfig.Spec.Build.Commands转换为指令并与构建过程的合并。 - 调用
GenerateDockerfileContents函数,将第一步获取的内容转换为DockerfileContent。
resolveProcessorDockerfileInfo函数:- 调用
GetProcessorDockerfileInfo函数,获取默认的runtime。 - 调用
getProcessorDockerfileBaseImage函数,a. 第一优先级FunctionConfig.Spec.Build.BaseImage;b. GetProcessorDockerfileInfo函数中格式为fmt.Sprintf("%s/nuclio/handler-builder-java-onbuild:%s-%s"。 - 调用函数
renderDependantImageURL - 调用函数
getProcessorDockerfileOnbuildImage - 增加health-check组件
- 调用
GetProcessorDockerfileInfo函数(meige):- 指定BaseImage和OnbuildArtifacts,其中OnbuildArtifacts包含onbuildImage和path。
GetProcessorDockerfileInfo -> resolveProcessorDockerfileInfo -> getRuntimeProcessorDockerfileInfo -> createProcessorDockerfile