重要
阅读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.go
pkg/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.go
pkg/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