看新闻很累?看技术新闻更累?试试下载 InfoQ 手机客户端,每天上下班路上听新闻,有趣还有料!
Google 发布了“ Kaniko ”,一种用于在未授权容器或 Kubernetes 集群中构建容器镜像的开源工具。虽然 Kaniko 也是根据用户给定的 Dockerfile 构建镜像,但是并不依赖于 Docker 守护进程,而是在用户空间中完全执行每个命令,并对所导致的文件系统更改做快照。
要从一个标准 Dockerfile 构建镜像,通常依赖于对 Docker 守护进程的交互访问,这需要具有运行 Docker 守护进程主机的 root 访问权限。在宣布 Kaniko 发布的 GCP(Google Cloud Platform)官方博客帖子中指出,对于 Kubernetes 集群等环境,不方便甚至是不能安全地暴露 Docker 守护进程,这使得容器镜像难以构建。
Kaniko 解决了上述挑战,它无需授权 root 访问权限,即可从 Dockerfile 构建容器镜像。Kaniko 支持通过 Docker 和 gcloud SDK ,运行在标准 Kubernetes 集群(使用 Kubernetes Secrets ,其中只包括向 Docker 仓库推送最终镜像所需的认证信息)、 Google Container Builder 中,或是在本地运行。
Kaniko 以容器镜像方式运行,它需要指定三个参数:Dockerfile、构建上下文,以及推送最终镜像的仓库(registry)名。所使用的镜像是从空白(Scratch)镜像开始构建的。空白镜像中只包括了静态的Go 二进制文件,以及推送和拉取镜像所需配置文件。Kaniko 执行器可获取并抽取给定基础镜像中的文件系统,并将其置于容器的根文件系统。这里所说的“基础镜像”,就是在给定的Dockerfile 中由FROM 指令所指定的镜像。
之后,Kaniko 按Dockerfile 定义的顺序,依次执行Dockerfile 中的每个指令,并在执行完一个指令后,对文件系统做一次快照。快照创建于用户空间中,在文件系统中按层次组织,并依次将当前快照与先前存储在内存中的状态进行对比。快照将文件系统的任何更改存储为基础镜像的一个新层,并将任何相关的更改反映到镜像元数据中。在Dockerfile 中所有指令执行完成后,新构建的镜像将由Kaniko 执行器推送到指定的Docker 仓库。所有上述步骤,完全是在执行器镜像的用户空间中完成的。这就是为什么Kaniko 能避免授权主机访问,因为“Docker 守护进程和CLI 并未参与其中”。
Kaniko 容器镜像构建流程图(图片来源: GCP 官方博客)
Kaniko 支持执行大部分 Dockerfile 指令,但目前尚不支持 SHELL、HEALTHCHECK、STOPSIGNAL 和 ARG 指令,也未支持多阶段构建(Multi-Stage)Dockerfile。据 Kaniko 团队称,解决这些局限的相关工作正在开展中。
目前还有一些类似于 Kaniko 的工具,其中包括 img 、 orca-build 、 buildah 、 FTL 和 Bazel rules_docker 。img 支持在容器内以非 root 用户运行,但是需要容器具有“RawProc 访问权限”,这样才能创建嵌套容器(与之相对比,Kaniko 并不需要创建嵌套容器,因此也不需要具有 RawProc 访问权限)。orca-build 依赖 runC 环境实现从 Dockerfile 构建镜像,但是 runC 本身不能运行在容器中。buildah 需要具有运行 Docker 守护进程同样的权限。
FTL 和 Bazel 的目的在于对一小部分镜像实现尽可能最快速的 Docker 镜像创建。Kankio 的 README 文件指出,“它们可以看成是‘快速路径’的一种特殊情况,可与 Kaniko 提供的对通用 Dockerfile 的支持联合使用”。
对于如何将镜像构建融合到容器开发构建和部署的整个生命周期中,感兴趣的读者可以参阅 InfoQ 的前期报道“ Google 发布 Skaffold,简化 Kubernetes 应用程序持续开发”。文中总结了适用于此过程的多种工具,并给出了推荐的过程。
据 Kaniko GitHub 代码库的 README.md 文件所述,该工具目前尚不能用于生产环境,欢迎对项目给出贡献、特性请求和软件缺陷报告。关于 Kaniko 发布的更多信息,参见 GCP 官方博客帖子“ Kaniko 介绍:无需授权在 Kubernetes 和 GCP 中构建容器镜像”。
查看英文原文: GCP Release “kaniko”, a Tool to Build Container Images Inside Unprivileged Containers or Kubernetes
评论