Kaniko在containerd中无特权快速构建并推送容器镜像
目录
一、kaniko是什么
二、kaniko工作原理
三、kanijo工作在Containerd上
基于serverless的考虑,我们选择了kaniko作为镜像打包工具,它是google提供了一种不需要特权就可以构建的docker镜像构建工具。
一、kaniko是什么
kaniko 是一种在容器或 Kubernetes 集群内从 Dockerfile 构建容器镜像的工具。kaniko 不依赖于 Docker 守护进程,而是完全在用户空间中执行 Dockerfile 中的每个命令。这使得在无法轻松或安全地运行 Docker 守护程序的环境中构建容器镜像成为可能,例如标准的 Kubernetes 集群。
二、kaniko工作原理
kaniko作为一个容器镜像运行,它接受三个参数:一个 Dockerfile ,一个构建上下文以及将镜像推送到的注册表。它在执行程序镜像中提取基本镜像的文件系统。然后,在Dockerfile中执行任何命令,快照用户空间中的文件系统。Kaniko在每个命令后都会将一层已更改的文件附加到基本镜像。最后,执行程序将新镜像推送到指定的注册表。由于Kaniko在执行程序镜像的用户空间中完全执行了这些操作,因此它完全避免了在用户计算机上需要任何特权访问。

- 读取并解析指定的Dockerfile
- 提取基础镜像的文件系统(Dockerfile 中的 FROM 镜像)
- 在独立的Dockerfile中分别运行每个命令
- 每次运行后都会对用户空间文件系统的做快照
- 每次运行时,将快照层附加到基础层并更新镜像元数据
- 最后推送镜像
三、kanijo工作在Containerd上
我们的环境中只安装了containerd.io 容器运行时没有 Docker 或者 Kubernetes 环境时,我们也可以采用kaniko进行镜像构建与发布,具体操作流程步骤如下:
环境说明
操作系统版本:
root@testmachine:/# lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 20.04.5 LTS
Release: 20.04
Codename: focal
root@testmachine:/#
containerd版本:
root@testmachine:/# containerd -v
containerd github.com/containerd/containerd v1.7.0 1fbd70374134b891f97ce19c70b6e50c7b9f4e0d
root@testmachine:/#
ctr版本:
root@testmachine:/# ctr -v
ctr github.com/containerd/containerd v1.7.0
root@testmachine:/#
1.提前拉取kaniko-executor镜像
可以提前拉取 kaniko-executor:latest 镜像以加快构建速度,此处将镜像拉到默认的名称空间下
官方镜像特殊原因国内无法访问,可以直接访问大神阿里云的镜像仓库拉取
拉取镜像
ctr -n default images pull registry.cn-hangzhou.aliyuncs.com/weiyigeek/kaniko-executor:latest
查看本地镜像
ctr image list | grep "kaniko-executor"
root@testmachine:/# ctr image list | grep "kaniko-executor"
registry.cn-hangzhou.aliyuncs.com/weiyigeek/kaniko-executor:latest application/vnd.docker.distribution.manifest.v2+json sha256:5aacba9599e8e112279e6e316f1164e584e9b59e5f159b275c6b482e0913c13e 24.6 MiB linux/amd64 -
root@testmachine:/#
2.准备镜像仓库认证所需的凭据
需要推送的阿里云容器镜像仓库的账号以及密码,可以按照下述的流程进行生成config.json文件。
在linux环境运行下面命令得到账号密码是base64编码字符串
echo -n "username:password" | base64
注意下述为格式为 你的容器镜像仓库账号:你的容器镜像密码
oot@testmachine:/# echo -n "username:password" | base64
dXNlcm5hbWU6cGFzc3dvcmQ=
root@testmachine:/#
这里就是BASE64 编码:dXNlcm5hbWU6cGFzc3dvcmQ=
生成认证所需的凭据
cat > config.json <<EOF
{"auths": {"https://index.docker.io/v1/": {"auth": "BASE64编码"}}
}
EOF
config.json文件内容:
cat config.json
{ "auths": {"registry.cn-hangzhou.aliyuncs.com": {"auth": "dXNlcm5hbWU6cGFzc3dvcmQ="}}}
3.准备dockerfile文件
tee dockerfile <<'EOF'
FROM docker.io/library/busybox:1.35.0
LABEL MAINTAINER=Andy BUILDTOOLS=kaniko BUILDENV=containerd.io;
ENTRYPOINT ["/bin/sh", "-c", "echo hello,busybox"]
EOF
dockerfile文件内容
FROM docker.io/library/busybox:1.35.0
LABEL MAINTAINER=Andy BUILDTOOLS=kaniko BUILDENV=containerd.io;
ENTRYPOINT ["/bin/sh", "-c", "echo hello,busybox"]
工作目录和所有涉及到文件
[root@testmachine /]# tree 5 /data/data
└── kaniko├── config│ └── config.json└── demo1└── dockerfile[root@testmachine /]#
4.ctr运行容器构建镜像
执行containerd.io提供的ctr客户端工具直接创建容器,例如如下命令:构建busybox镜像并推送
ctr -n default run --rm --net-host --env DOCKERHUB=docker.io \
--mount type=bind,src=/data/kaniko/config,dst=/kaniko/.docker,options=rbind:ro \
--mount type=bind,src=/data/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=registry.cn-hangzhou.aliyuncs.com/gmaaa123/busybox:1.999
运行结果
[root@testmachine /]#
[root@testmachine /]# ctr -n default run --rm --net-host --env DOCKERHUB=docker.io \
> --mount type=bind,src=/data/kaniko/config,dst=/kaniko/.docker,options=rbind:ro \
> --mount type=bind,src=/data/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=registry.cn-hangzhou.aliyuncs.com/gmaaa123/busybox:1.999
INFO[0001] Retrieving image manifest docker.io/library/busybox:1.35.0
INFO[0001] Retrieving image docker.io/library/busybox:1.35.0 from registry index.docker.io
INFO[0013] Built cross stage deps: map[]
INFO[0013] Retrieving image manifest docker.io/library/busybox:1.35.0
INFO[0013] Returning cached image manifest
INFO[0013] Executing 0 build triggers
INFO[0013] Building stage 'docker.io/library/busybox:1.35.0' [idx: '0', base-idx: '-1']
INFO[0013] Skipping unpacking as no commands require it.
INFO[0013] LABEL MAINTAINER=Andy BUILDTOOLS=kaniko BUILDENV=containerd.io;
INFO[0013] Applying label MAINTAINER=Andy
INFO[0013] Applying label BUILDTOOLS=kaniko
INFO[0013] Applying label BUILDENV=containerd.io;
INFO[0013] ENTRYPOINT ["/bin/sh", "-c", "echo hello,busybox"]
INFO[0013] Pushing image to registry.cn-hangzhou.aliyuncs.com/gmaaa123/busybox:1.999
INFO[0015] Pushed registry.cn-hangzhou.aliyuncs.com/gmaaa123/busybox@sha256:557cc2302c0ae328d99ca9f7ed8c96928034a5f94a7432f95dbc41a9740a123f
[root@testmachine /]#
上述参数定义:
-n 指定名称空间
--rm 在退出容器时删除容器
--net-host 使用主机网络
--env 指定容器内部shell变量
--mount 指定挂载到容器内部的本地文件,src是指定宿主机上文件目录路径,而dst是指定容器内部目录
--dockerfile 指定Dockerfile
--context 定义位置获取编排位置,即上下文
--destination 远端镜像仓库
--insecure=true 仓库为私有http仓库
--skip-tls-verify=true 跳过tls验证
在阿里云容器镜像站上查看
https://cr.console.aliyun.com/repository/cn-hangzhou

5.测试
1.从仓库拉取刚刚构建好镜像
ctr -n default images pull --user 仓库账号:仓库密码 registry.cn-hangzhou.aliyuncs.com/gmaaa123/busybox:1.999
运行结果
[root@localhost /]# ctr -n default images pull --user 仓库账号:仓库密码 registry.cn-hangzhou.aliyuncs.com/gmaaa123/busybox:1.999
registry.cn-hangzhou.aliyuncs.com/gmaaa123/busybox:1.999: resolved |++++++++++++++++++++++++++++++++++++++|
manifest-sha256:557cc2302c0ae328d99ca9f7ed8c96928034a5f94a7432f95dbc41a9740a123f: done |++++++++++++++++++++++++++++++++++++++|
config-sha256:ff69b8070e65ef902da17038ea9821d3bfaf74cd2afcf0ceb1b2df365930cecb: done |++++++++++++++++++++++++++++++++++++++|
layer-sha256:db2e1e3b46c0af1ae524f68073dccd02b5b10a0388a7b3a3f1617ee996376c34: done |++++++++++++++++++++++++++++++++++++++|
elapsed: 18.7s total: 2.1 Mi (115.6 KiB/s)
unpacking linux/amd64 sha256:557cc2302c0ae328d99ca9f7ed8c96928034a5f94a7432f95dbc41a9740a123f...
done: 128.981892ms
[root@localhost /]#
2.查看本地镜像
ctr image list | grep "busybox"
运行结果
[root@testmachine/]#
[root@testmachine/]# ctr image list | grep "busybox"
registry.cn-hangzhou.aliyuncs.com/gmaaa123/busybox:1.999 application/vnd.docker.distribution.manifest.v2+json sha256:557cc2302c0ae328d99ca9f7ed8c96928034a5f94a7432f95dbc41a9740a123f 2.1 MiB linux/amd64 -
[root@testmachine/]#
3.运行容器,查看输出结果 (--rm运行后删除容器)
ctr -n default run --rm registry.cn-hangzhou.aliyuncs.com/gmaaa123/busybox:1.999 busybox
运行结果
[root@testmachine /]#
[root@testmachine /]# ctr -n default run --rm registry.cn-hangzhou.aliyuncs.com/gmaaa123/busybox:1.999 busybox
hello,busybox
[root@testmachine /]#
到此结束,在containerd.io 环境中,进行镜像构建并发布到镜像仓库中实战成功!
kaniko官方github页面 https://github.com/GoogleContainerTools/kaniko
相关文章:
Kaniko在containerd中无特权快速构建并推送容器镜像
目录 一、kaniko是什么 二、kaniko工作原理 三、kanijo工作在Containerd上 基于serverless的考虑,我们选择了kaniko作为镜像打包工具,它是google提供了一种不需要特权就可以构建的docker镜像构建工具。 一、kaniko是什么 kaniko 是一种在容器或 Kube…...
分享5款不会被打入冷宫的神器软件
检查一下你最近安装的软件,他们是不是都一样无法避免最终被你打入冷宫的命运?我们明明很懂“在精不在多”的道理,却依然让我们的电脑塞满了形形色色无用的软件。你需要知道的是,如何找到一款适合自己且真正实用的电脑软件。 自…...
Windows如何部署Redis
一、简介 Redis (Remote Dictionary Server) 是一个由意大利人 Salvatore Sanfilippo 开发的 key-value 存储系统,具有极高的读写性能,读的速度可达 110000 次/s,写的速度可达 81000 次/s 。 二、下载 访问 https://github.com/tporadows…...
VUE数据双向绑定原理解析
VUE数据双向绑定原理解析 在Vue.js中,数据双向绑定是一项非常强大的功能。它使开发者能够轻松地将模板与数据进行动态关联,实现了页面和数据之间的实时同步更新。本文将深入探讨VUE中数据双向绑定的原理,并通过代码示例演示其工作机制。 1.…...
SSM商城项目实战:订单管理
SSM商城项目实战:订单管理 在SSM商城项目中,订单管理是一个非常重要的功能模块。本文将详细介绍订单管理的实现思路和步骤代码。 实现SSM商城项目中订单管理功能的思路如下: 设计数据库表结构:根据订单管理的需求,设计…...
SELinux 入门 pt.2
哈喽大家好,我是咸鱼 在《SELinux 入门 pt.1》中,咸鱼向各位小伙伴介绍了 SELinux 所使用的 MAC 模型、以及几个重要的概念(主体、目标、策略、安全上下文) 我们还讲到: 对于受 SELinux 管制的进程,会先…...
函数(个人学习笔记黑马学习)
1、函数定义 #include <iostream> using namespace std;int add(int num1, int num2) {int sum num1 num2;return sum; }int main() {system("pause");return 0; } 2、函数的调用 #include <iostream> using namespace std;int add(int num1, int num2…...
《Flink学习笔记》——第五章 DataStream API
一个Flink程序,其实就是对DataStream的各种转换,代码基本可以由以下几部分构成: 获取执行环境读取数据源定义对DataStream的转换操作输出触发程序执行 获取执行环境和触发程序执行都属于对执行环境的操作,那么其构成可以用下图表示…...
Vue3.0 新特性以及使用变更总结
Vue3.0 在2020年9月正式发布了,也有许多小伙伴都热情的拥抱Vue3.0。去年年底我们新项目使用Vue3.0来开发,这篇文章就是在使用后的一个总结, 包含Vue3新特性的使用以及一些用法上的变更。 图片.png 为什么要升级Vue3 使用Vue2.x的小伙伴都熟悉…...
ToBeWritten之VSOC安全运营
也许每个人出生的时候都以为这世界都是为他一个人而存在的,当他发现自己错的时候,他便开始长大 少走了弯路,也就错过了风景,无论如何,感谢经历 转移发布平台通知:将不再在CSDN博客发布新文章,敬…...
2023爱分析·一站式通信解决方案市场厂商评估报告:牛信云
[图片] 01 中国企业出海发展背景及阶段 出海背景:出海,对中国企业而言,并不陌生。从最初的贸易型出海,到制造业崛起,再到互联网、移动互联网产业腾飞,中国企业在出海道路上走的越发稳健。行业也从最初的家电…...
微信小程序消防知识每天学平台设计与实现
摘 要 消防是当下一个人都需要在日常生活中所高度重视的事项。消防安全关系到居民的日常生活的安全,通过学习消防知识能够提升人们在日常生活中对于灾难的防范。通过对当下的大学生进行调查研究后发现,现在的年轻人在消防意识上比较的单薄,对…...
Oracle跨库访问DBLINK
1. DBLINK的介绍 Oracle在进行跨库访问时,可以创建DBLINK实现,比如要将UAT的表数据灌入开发环境,则可以使用UAT库为数据源,通过DBLINK实现将查出的数据灌入开发库。 简而言之就是在当前数据库中访问另一个数据库中的表中的数据 2…...
【vue3.0 组合式API与选项式API是什么,有什么区别】
vue3.0 组合式API与选项式API是什么 Vue3.0中引入了组合式API(Composition API),同时保留了选项式API(Options API)。两种 API 风格都能够覆盖大部分的应用场景。它们只是同一个底层系统所提供的两套不同的接口。实际…...
React配置代理的5种方法
React配置代理的五种方法的介绍 使用create-react-app的代理配置: 使用场景:适用于使用create-react-app创建的React项目,特别是小型项目或快速原型开发。优点:配置简单,无需额外安装依赖,适合快速开发和简…...
皮卡丘靶场搭建遇到的问题大全
该博客记录我在安装皮卡丘靶场中遇到的一些问题。 1、 phpstudy_pro启动Mysql失败 自己电脑开启了mysql服务,使用winr,services.msc,找到自己的mysql服务,关闭。再次尝试使用phpstudy_pro启动mysql,成功解决。 2、皮…...
【C++】C++11的新特性(上)
引入 C11作为C标准的一个重要版本,引入了许多令人振奋的新特性,极大地丰富了这门编程语言的功能和表达能力。本章将为您介绍C11的一些主要变化和改进,为接下来的章节铺垫。 文章目录 引入 一、列表初始化 1、1 {} 初始化 1、2 std::initiali…...
ubuntu学习(四)----文件写入操作编程
1、write函数的详解 ssize_t write(int fd,const void*buf,size_t count); 参数说明: fd:是文件描述符(write所对应的是写,即就是1) buf:通常是一个字符串,需要写入的字符串 count:是每次写入的字节数…...
如何解决MySQL中的套接字错误
MySQL通过使用** socket文件**来管理到数据库服务器的连接,socket文件是一种特殊的文件,可以促进不同进程之间的通信。MySQL服务器的套接字文件名为mysqld.sock,在Ubuntu系统中,它通常存储在/var/run/mysqld/目录中。该文件由MySQ…...
socket
Socket是一种用于网络通信的编程接口,它提供了在计算机网络中进行数据传输的方法。通过Socket,可以在不同主机之间建立网络连接,并通过发送和接收数据来进行通信。在C语言中,可以使用Socket函数库(如BSD Socket或Winso…...
XCTF-web-easyupload
试了试php,php7,pht,phtml等,都没有用 尝试.user.ini 抓包修改将.user.ini修改为jpg图片 在上传一个123.jpg 用蚁剑连接,得到flag...
在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能
下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能,包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...
8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂
蛋白质结合剂(如抗体、抑制肽)在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上,高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术,但这类方法普遍面临资源消耗巨大、研发周期冗长…...
Linux简单的操作
ls ls 查看当前目录 ll 查看详细内容 ls -a 查看所有的内容 ls --help 查看方法文档 pwd pwd 查看当前路径 cd cd 转路径 cd .. 转上一级路径 cd 名 转换路径 …...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院查看报告小程序
一、开发环境准备 工具安装: 下载安装DevEco Studio 4.0(支持HarmonyOS 5)配置HarmonyOS SDK 5.0确保Node.js版本≥14 项目初始化: ohpm init harmony/hospital-report-app 二、核心功能模块实现 1. 报告列表…...
Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理
引言 Bitmap(位图)是Android应用内存占用的“头号杀手”。一张1080P(1920x1080)的图片以ARGB_8888格式加载时,内存占用高达8MB(192010804字节)。据统计,超过60%的应用OOM崩溃与Bitm…...
Redis数据倾斜问题解决
Redis 数据倾斜问题解析与解决方案 什么是 Redis 数据倾斜 Redis 数据倾斜指的是在 Redis 集群中,部分节点存储的数据量或访问量远高于其他节点,导致这些节点负载过高,影响整体性能。 数据倾斜的主要表现 部分节点内存使用率远高于其他节…...
Mobile ALOHA全身模仿学习
一、题目 Mobile ALOHA:通过低成本全身远程操作学习双手移动操作 传统模仿学习(Imitation Learning)缺点:聚焦与桌面操作,缺乏通用任务所需的移动性和灵活性 本论文优点:(1)在ALOHA…...
10-Oracle 23 ai Vector Search 概述和参数
一、Oracle AI Vector Search 概述 企业和个人都在尝试各种AI,使用客户端或是内部自己搭建集成大模型的终端,加速与大型语言模型(LLM)的结合,同时使用检索增强生成(Retrieval Augmented Generation &#…...
Kafka入门-生产者
生产者 生产者发送流程: 延迟时间为0ms时,也就意味着每当有数据就会直接发送 异步发送API 异步发送和同步发送的不同在于:异步发送不需要等待结果,同步发送必须等待结果才能进行下一步发送。 普通异步发送 首先导入所需的k…...
