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…...

idea大量爆红问题解决
问题描述 在学习和工作中,idea是程序员不可缺少的一个工具,但是突然在有些时候就会出现大量爆红的问题,发现无法跳转,无论是关机重启或者是替换root都无法解决 就是如上所展示的问题,但是程序依然可以启动。 问题解决…...
DockerHub与私有镜像仓库在容器化中的应用与管理
哈喽,大家好,我是左手python! Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库,用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...

渗透实战PortSwigger靶场-XSS Lab 14:大多数标签和属性被阻止
<script>标签被拦截 我们需要把全部可用的 tag 和 event 进行暴力破解 XSS cheat sheet: https://portswigger.net/web-security/cross-site-scripting/cheat-sheet 通过爆破发现body可以用 再把全部 events 放进去爆破 这些 event 全部可用 <body onres…...

CentOS下的分布式内存计算Spark环境部署
一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架,相比 MapReduce 具有以下核心优势: 内存计算:数据可常驻内存,迭代计算性能提升 10-100 倍(文档段落:3-79…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院查看报告小程序
一、开发环境准备 工具安装: 下载安装DevEco Studio 4.0(支持HarmonyOS 5)配置HarmonyOS SDK 5.0确保Node.js版本≥14 项目初始化: ohpm init harmony/hospital-report-app 二、核心功能模块实现 1. 报告列表…...

C# 类和继承(抽象类)
抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...

MySQL 8.0 OCP 英文题库解析(十三)
Oracle 为庆祝 MySQL 30 周年,截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始,将英文题库免费公布出来,并进行解析,帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...
Java线上CPU飙高问题排查全指南
一、引言 在Java应用的线上运行环境中,CPU飙高是一个常见且棘手的性能问题。当系统出现CPU飙高时,通常会导致应用响应缓慢,甚至服务不可用,严重影响用户体验和业务运行。因此,掌握一套科学有效的CPU飙高问题排查方法&…...

RabbitMQ入门4.1.0版本(基于java、SpringBoot操作)
RabbitMQ 一、RabbitMQ概述 RabbitMQ RabbitMQ最初由LShift和CohesiveFT于2007年开发,后来由Pivotal Software Inc.(现为VMware子公司)接管。RabbitMQ 是一个开源的消息代理和队列服务器,用 Erlang 语言编写。广泛应用于各种分布…...
scikit-learn机器学习
# 同时添加如下代码, 这样每次环境(kernel)启动的时候只要运行下方代码即可: # Also add the following code, # so that every time the environment (kernel) starts, # just run the following code: import sys sys.path.append(/home/aistudio/external-libraries)机…...