kaniko 是一个在容器或 Kubernetes 集群内从 Dockerfile 构建容器镜像的工具 ( Build Container Images In Kubernetes )
176
设为「特别关注」每天带你玩转网络安全运维、应用开发、物联网IOT学习!
希望各位看友【关注、点赞、评论、收藏、投币】,助力每一个梦想。
[-] 作者主页:https://www.weiyigeek.top
[-] 作者博客:https://blog.weiyigeek.top
什么是Kaniko?
kaniko 是一个在容器或 Kubernetes 集群内从 Dockerfile 构建容器镜像的工具 ( Build Container Images In Kubernetes )。
温馨提示: kaniko不是谷歌官方发布支持的产品.
为啥用Kaniko?
由于 kaniko 不依赖于 Docker 守护进程,并且完全在用户空间中执行 Dockerfile 中的每个命令。这使得能够在轻松或安全地运行在
无Docker守护程序的环境(如标准Kubernetes集群 V1.24.x)中构建容器映像。
Kaniko是如何工作的? kaniko 执行器镜像负责从 Dockerfile 构建镜像并将其推送到注册表,其流程大致如下:
Kaniko已知功能问题
项目地址: https://github.com/GoogleContainerTools/kaniko 图像镜像仓库: gcr.io/kaniko-project/executor 国内镜像: weiyigeek/kaniko-executor:latest
描述:当我们的环境中只安装了containerd.io 容器运行时没有 Docker 或者 Kubernetes 环境时,我们也可以采用kaniko进行镜像构建与发布,具体操作流程步骤如下:
环境说明
$ lsb_release -a
Distributor ID: Ubuntu
Description: Ubuntu 20.04.3 LTS
Release: 20.04
Codename: focal
$ containerd -v
containerd containerd.io 1.4.12 7b11cfaabd73bb80907dd23182b9347b4245eb5d
$ ctr -v
ctr containerd.io 1.4.12
温馨提示: 此处使用的是 Ubuntu 20.04 操作系统, 该系统已做安全加固和内核优化符合等保2.0要求【SecOpsDev/Ubuntu-InitializeSecurity.sh at master · WeiyiGeek/SecOpsDev 】, 如你的Linux未进行相应配置环境可能与读者有些许差异, 如需要进行(windows server、Ubuntu、CentOS)安全加固请参照如下加固脚本进行加固, 请大家疯狂的star 。 加固脚本地址:【 https://github.com/WeiyiGeek/SecOpsDev/blob/master/OS-%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/Linux/Ubuntu/Ubuntu-InitializeSecurity.sh 】
温馨提示:如果你使用的是最新 Ubuntu 22.04 操作系统,并需要对其安全加固和内核优化以满足等保2.0要求可参考如下加固脚本 【https://github.com/WeiyiGeek/SecOpsDev/tree/master/OperatingSystem/Security/Ubuntu】。

操作流程
步骤 01.此处假设你已经安装配置好containerd.io了,如果没有安装配置请参考此篇文章【 1.Containerd容器运行时初识与尝试 - https://blog.weiyigeek.top/2021/6-27-570.html 】,此处不再累述。
步骤 02.验证 containerd.io 服务状态以及提前拉取 kaniko-executor:latest 镜像以加快构建速度,此处将镜像拉到默认的名称空间下。
$ systemctl status containerd.service
● containerd.service - containerd container runtime
Loaded: loaded (/lib/systemd/system/containerd.service; enabled; vendor preset: enabled)
Active: active (running) since Thu 2022-09-08 11:48:30 CST; 4h 49min ago
Docs: https://containerd.io
Process: 561811 ExecStartPre=/sbin/modprobe overlay (code=exited, status=0/SUCCESS)
Main PID: 561812 (containerd)
Tasks: 106
Memory: 4.0G
$ ctr -n default images pull registry.cn-hangzhou.aliyuncs.com/weiyigeek/kaniko-executor:latest
步骤 03.准备登录 hub docker 的账号以及密码,你可以按照下述的流程进行生成config.json文件。
mkdir /storage/dev/soft/kaniko/{config,demo1}
cd /storage/dev/soft/kaniko/config
# 生成认证所需的凭据
# BASE64 编码,注意下述为格式为 你的hub账号:你的hub密码
AUTH=$(echo -n "weiyigeek:password" | base64)
# BASE64 解码
echo ${AUTH} | base64 -d
# 使用该方法可以解析变量 AUTH (值得注意)
cat > config.json <<EOF
{
"auths": {
"https://index.docker.io/v1/": {
"auth": "${AUTH}"
}
}
}
EOF
# 生成结果
cat config.json
{
"auths": {
"https://index.docker.io/v1/": {
"auth": "d2VpeWlnZ************AxOQ=="
}
}
}
步骤 04.准备dockerfile文件,此处将busybox:1.35.0镜像重新构建后上传到我的账户下的hub仓库中,该文件示例如下:
cd /storage/dev/soft/kaniko/demo1
tee dockerfile <<'EOF'
FROM docker.io/library/busybox:1.35.0
LABEL [email protected] BUILDTOOLS=kaniko BUILDENV=containerd.io;
ENTRYPOINT ["/bin/sh", "-c", "echo hello,busybox"]
EOF
步骤 05.当上述都准备完成后我们便可以执行containerd.io提供的ctr客户端工具直接创建容器,例如如下命令:
ctr -n default run --rm --net-host --env DOCKERHUB=docker.io \
--mount type=bind,src=/storage/dev/soft/kaniko/config,dst=/kaniko/.docker,options=rbind:ro \
--mount type=bind,src=/storage/dev/soft/kaniko/demo1,dst=/workspace,options=rbind:rw \
registry.cn-hangzhou.aliyuncs.com/weiyigeek/kaniko-executor:latest kaniko-executor \
/kaniko/executor --dockerfile=/workspace/dockerfile --context=dir://workspace --destination=docker.io/weiyigeek/busybox:1.35.0
# 参数说明
-n 指定名称空间
--rm 在退出容器时删除容器
--net-host 使用主机网络
--env 指定容器内部shell变量
--mount 指定挂载到容器内部的本地文件,src是指定宿主机上文件目录路径,而dst是指定容器内部目录。
执行结果:
INFO[0002] Retrieving image manifest docker.io/library/busybox:1.35.0
INFO[0002] Retrieving image docker.io/library/busybox:1.35.0 from registry index.docker.io
INFO[0006] Built cross stage deps: map[]
INFO[0006] Retrieving image manifest docker.io/library/busybox:1.35.0
INFO[0006] Returning cached image manifest
INFO[0006] Executing 0 build triggers
INFO[0006] Building stage 'docker.io/library/busybox:1.35.0' [idx: '0', base-idx: '-1']
INFO[0006] Skipping unpacking as no commands require it.
INFO[0006] LABEL [email protected] BUILDTOOLS=kaniko BUILDENV=containerd.io;
INFO[0006] Applying label [email protected]
INFO[0006] Applying label BUILDTOOLS=kaniko
INFO[0006] Applying label BUILDENV=containerd.io;
INFO[0006] ENTRYPOINT ["/bin/sh", "-c", "echo hello,busybox"]
INFO[0006] Pushing image to docker.io/weiyigeek/busybox:1.35.0
INFO[0010] Pushed index.docker.io/weiyigeek/busybox@sha256:d6ed480cc7864b9e19b40f09263abfad4689a9244a5abeb2e3eaf14a439cc55f
步骤 06.查看上传到docker hub中 的 busybox:1.35.0 镜像信息以及拉取到本地进行运行测试验证。
ctr -n default images pull docker.io/weiyigeek/busybox:1.35.0
ctr -n default run --rm docker.io/weiyigeek/busybox:1.35.0 busybox
hello,busybox

至此,在containerd.io 环境中,进行镜像构建并发布到hub中实践完毕!
【WeiyiGeek Blog 个人博客 - 为了能到远方,脚下的每一步都不能少 】
欢迎各位志同道合的朋友一起学习交流【点击加入交流群】,如文章有误请在下方留下您宝贵的经验知识!
作者主页: 【 https://weiyigeek.top】 博客地址: 【 https://blog.weiyigeek.top 】

专栏书写不易,如果您觉得这个专栏还不错的,请给这篇专栏 【点个赞、投个币、收个藏、关个注,转个发,留个言】(人间六大情),这将对我的肯定,谢谢!。
echo "【点个赞】,动动你那粗壮的拇指或者芊芊玉手,亲!"
printf("%s", "【投个币】,万水千山总是情,投个硬币行不行,亲!")
fmt.Printf("【收个藏】,阅后即焚不吃灰,亲!")
console.info("【转个发】,让更多的志同道合的朋友一起学习交流,亲!")
System.out.println("【关个注】,后续浏览查看不迷路哟,亲!")
cout << "【留个言】,文章写得好不好、有没有错误,一定要留言哟,亲! " << endl;
更多网络安全、系统运维、应用开发、物联网实践、网络工程、全栈文章,尽在 https://blog.weiyigeek.top 之中,谢谢各位看又支持!
Content type
Image
Digest
sha256:956b89aed…
Size
28.3 MB
Last updated
almost 3 years ago
docker pull weiyigeek/kaniko-executor:v1.13.0