Kaniko是Google发布的一款可以通过Dockerfile,容器或Kubernetes集群进行容器镜像构建的开源工具。通常我们在通过Dockerfile构建Docker镜像时,必须要有机器的root权限,这样在构建过程中才可以与Docker后台进程进行不断的交互访问。但在机器的Docker进程无法完全暴露的情况下(如Kubernetes集群),生成Docker镜像将是一种困难的事情。
Kaniko应运而生,它不依赖于Docker守护程序,在没有root权限情况便可以完全在用户空间中执行Dockerfile中的每一条命令,轻松的生成Docker镜像并将其推送到镜像仓库。 因此,Kaniko可以应用于那些并不是很容易或者安全的条件下获取到ROOT权限的环境中进行构建容器镜像,如标准的Kubernetes集群、Google Kubernetes引擎以及其它无法访问Docker后台进程的环境。
工作原理
Kaniko在执行时需要三个输入:Dockerfile,构建上下文,最终上传镜像的镜像仓库名。最终生成的镜像仅包含一个静态的Go二进制文件以及与推送、拉取镜像相关的配置文件信息。

Docker镜像的生成是通过Kaniko执行器来构建生成的,Kaniko执行器首先根据Dockerfile中的FROM一行命令解析基础镜像,按照Dockerfile中的顺序来执行每一行命令,在每执行完一条命令之后,会在用户目录空间中产生一个文件系统的快照,并与存储于内存中的上一个状态进行对比,若有改变,则将其认为是对基础镜像进行的修改,并以新层级的形式对文件系统进行增加扩充,并将修改写入镜像的元数据中。在执行完Dockerfile中的每一条指令之后,Kaniko执行器将最终的镜像文件推送到指定的镜像仓库。
Kaniko可以在不具有ROOT权限的环境下,完全在用户空间中执行解压文件系统,执行构建命令以及生成文件系统的快照等一系列操作,以上构建的过程完全没有引入docker 守护进程以及CLI的操作。
与其它工具对比
与Kaniko相似的工具有img,orca-build,buildah ,它们都需要通过Dockerfile来构建容器镜像,但采取不同的方法与安全权衡策略。在没有主机特权的条件下,img通过非特权身份在容器中构建镜像,Kaniko则是以ROOT用户身份在容器内构建生成镜像。orca-build通过包装runC(通过内核的命名空间技术来执行RUN命令)来执行构建,Kaniko可以实现同样的功能通过在容器内以ROOT身份来执行构建命令而不需要使用内核命名空间技术。buildah需要具有与Dokcer守护进程相同的权限,Kaniko则不需要任何特权与许可。
网友评论