Kaniko构建镜像

2023-05-16

一、前言

最近公司重构devops相关的一系列平台,对于流水线中用容器方式交付的产品越来越多,为了更加安全的方式来构建容器镜像,采用Kaniko构建。

在了解如何用Kaniko构建镜像之前,我们先了解一下几种构建镜像的方式。

二、docker构建镜像

docker构建镜像是常用的方法,在具备构建容器镜像所需要的两个要素(Dockerfile和上下文)的前提下,用下命令就能构建一个容器镜像出来。

docker build -t your_registry/your_repository:tag .

然后用 docker push 将镜像推送到镜像仓库

 docker push your_registry/your_repository:tag

三、容器内构建镜像

现在DevOps 的CI/CD环境大多数都会运行在容器内,镜像的构成也是在容器内完成的。这时候,通常用以下两种方式来完成容器内构建镜像的工作:

第一:挂载宿主机的socket文件到容器内部

docker run -it -v /var/run/docker.sock:/var/run/docker.sock -v /tmp/kaniko:/tmp/kaniko docker

然后在容器内部用 docker build 构建镜像

$ docker build -t dllhb/kaniko-test:v0.1 .
Sending build context to Docker daemon  5.632kB
Step 1/4 : FROM alpine:latest
latest: Pulling from library/alpine
89d9c30c1d48: Already exists
Digest: sha256:c19173c5ada610a5989151111163d28a67368362762534d8a8121ce95cf2bd5a
Status: Downloaded newer image for alpine:latest
 ---> 965ea09ff2eb
Step 2/4 : MAINTAINER <devops008@sina.com xiaomage> 
 ---> Running in 8a2b1dc13d6b
Removing intermediate container 8a2b1dc13d6b 
 ---> bd535532278d
Step 3/4 : RUN apk add busybox-extras curl
 ---> Running in fc254ad3d088
fetch http://dl-cdn.alpinelinux.org/alpine/v3.10/main/x86_64/APKINDEX.tar.gz
fetch http://dl-cdn.alpinelinux.org/alpine/v3.10/community/x86_64/APKINDEX.tar.gz
(1/5) Installing busybox-extras (1.30.1-r3)
Executing busybox-extras-1.30.1-r3.post-install
(2/5) Installing ca-certificates (20190108-r0)
(3/5) Installing nghttp2-libs (1.39.2-r0)
(4/5) Installing libcurl (7.66.0-r0)
(5/5) Installing curl (7.66.0-r0)
Executing busybox-1.30.1-r2.trigger
Executing ca-certificates-20190108-r0.trigger
OK: 7 MiB in 19 packages
Removing intermediate container fc254ad3d088
 ---> 1bbe81600a67
Step 4/4 : CMD ["echo","Hello DevOps"]
 ---> Running in 4b92a6a4b37e
Removing intermediate container 4b92a6a4b37e
 ---> de712b8cd7e5
Successfully built de712b8cd7e5
Successfully tagged dllhb/kaniko-test:v0.1

由于docker依赖于 docker daemon 进程, docker daemon 进程是一个 Unixsocket 连接,且 /var/run/docker.sock 文件是root权限,

$ ls -ltr /var/run/docker.sock
lrwxr-xr-x 1 root  daemon 69 Nov 26 15:13 /var/run/docker.sock

说明只有root权限才能访问 docker daemon 进程,在 docker daemon 无法暴露或者用户没有权限获取 docker daemon 进程的前提下,用 docker build 来构建镜像就变的非常困难了。

可能我们会想,docker build镜像无非就是需要docker命令能运行成功,只要在容器里面安装一个docker不就成功了吗?这也就是下面讲的第二种方法。

第二:dind(docker-in-docker)

这种方式不需要挂载宿主机的socket文件,但是需要以 --privileged 权限来以dind镜像创建一个容器:

$ docker run --rm -it --privileged docker:18.06-dind

然后在容器里面构建容器镜像并推送至远端仓库。

dind能够满足构建容器镜像的需求,但是从上面的命令看,有一个参数:–privileged 。意味这这个容器具有一些特权,他可能会看到宿主机上的一些设备,而且能够执行mount命令。

dind还有很多问题,只是方便docker开发人员来测试docker,所以官方也说running Docker inside Docker is generally not recommended。具体的可以看看这篇博文: https://jpetazzo.github.io/20…
上述两种方法,都能满足在容器内构建容器镜像且推送镜像至远端仓库的需求,但是从security角度来讲,需要root 权限(第一种方式),提供特权(第二种方式) 都使得风险增大,在Kubernetes 多租户的场景下,这种风险是不能接受的。那是否有一种不需要特殊权限,还能快速构建容器镜像的方法呢?答案就是下面将的Kaniko。

四、Kaniko介绍

Kaniko是谷歌开源的一款用来构建容器镜像的工具。与docker不同,Kaniko 并不依赖于Docker daemon进程,完全是在用户空间根据Dockerfile的内容逐行执行命令来构建镜像,这就使得在一些无法获取 docker daemon 进程的环境下也能够构建镜像,比如在标准的Kubernetes Cluster上。
在这里插入图片描述
aniko 以容器镜像的方式来运行的,同时需要三个参数: Dockerfile,上下文,以及远端镜像仓库的地址。

Kaniko会先提取基础镜像(Dockerfile FROM 之后的镜像)的文件系统,然后根据Dockerfile中所描述的,一条条执行命令,每一条命令执行完以后会在用户空间下面创建一个snapshot,并与存储与内存中的上一个状态进行比对,如果有变化,就将新的修改生成一个镜像层添加在基础镜像上,并且将相关的修改信息写入镜像元数据中。等所有命令执行完,kaniko会将最终镜像推送到指定的远端镜像仓库。

4.1、Kaniko Demo

这里选择的是 https://github.com/traefik/whoami 项目和https://github.com/peishunwu/kaniko项目用来测试
。访问该服务之后,接口会返回访

对项目的要求是,通过 Dockerfile 能够直接编译得到镜像。一共有两个验证点:

能够构建镜像
构建的镜像能够运行

4.2、在 Docker 上运行 Kaniko

生成推送镜像的凭证
以下说明:
YOUR_USERNAME(我的dockerhub账户)
YOUR_PASSWORD(我的dockerhub账户密码)

export AUTH=$(echo -n YOUR_USERNAME:YOUR_PASSWORD | base64 )

cat > config.json <<-EOF
{
	"auths": {
		"https://index.docker.io/v1/": {
			"auth": "${AUTH}"
		}
	}
}
EOF

构建镜像

docker run \
  --interactive -v `pwd`/config.json:/kaniko/.docker/config.json gcr.io/kaniko-project/executor:latest \
  --context git://github.com/traefik/whoami \
  --dockerfile Dockerfile \
  --destination=peishunwu/kaniko-demo:v1

参数说明:

  • context, 构建需要的上下文。支持多种格式,S3、本地目录、标准输入、Git 仓库等
  • dockerfile, Dockerfile 路径
  • destination, 构建后推送的镜像地址

其中–destination=peishunwu/kaniko-demo:v1
peishunwu/kaniko-demo:我的dockerhub的仓库
在这里插入图片描述
在生产环境,可以配置缓存,用于加速镜像构建。

查看日志
执行上一步的命令之后,可以看到如下输出:
在这里插入图片描述
在这里插入图片描述

如果没有问题会正常退出!

查看构建镜像是否落盘本地

docker images|grep kaniko-demo

在这里插入图片描述

执行完命令,没有任何输出,符合预期。构建之后的镜像,直接被推送到了远程 Registry。

DockerHub 查看镜像
在 DockerHub 页面可以查看到推送的镜像:
在这里插入图片描述

使用刚才上传到dockerhub镜像,创建容器
执行命令:

docker run -d -p 8011:80 peishunwu/kaniko-demo:v1

在这里插入图片描述
验证服务是否正常:

curl localhost:8011

Hostname: 6dd22f1e4100
IP: 127.0.0.1
IP: 172.17.0.2
RemoteAddr: 172.17.0.1:40940
GET / HTTP/1.1
Host: localhost:8011
User-Agent: curl/7.29.0
Accept: */*

在这里插入图片描述

五、在 Kubernetes 上运行 Kaniko

待测试验证,后续添加

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Kaniko构建镜像 的相关文章

随机推荐

  • ONOS链路发现源码

    ONOS链路发现源码 send LLDP by ynogpu private void sendProbes Long portNumber String portDesc if context packetService 61 61 nu
  • 手把手教你新建一个winform项目(史上最全)

    文章目录 前言 xff1a 第1步 打开Microsoft Visual Studio xff08 简称vs xff09 xff0c 本人这里使用的是Visual Studio 2017 专业版 xff0c 如下图 xff1a 1 2 Vi
  • 2021-01-20

    中文字库液晶模块12864示例程序范例 xff1a 液晶屏型号 xff1a JLX12864G 086 PC 3S 接口 xff1a 串行 中文字库 xff1a 带中文字库IC JLX GB2312 竖置横排 驱动IC UC1701X 与S
  • 前端开发中常见的浏览器兼容性问题及解决方案

    文章目录 前言一 浏览器四大内核二 主流兼容问题 xff08 一 xff09 浏览器引擎 xff08 二 xff09 兼容问题的原因 xff08 三 xff09 为什么浏览器会存在兼容性问题 xff08 四 xff09 处理兼容问题的思路1
  • 论文复现——Sphereface-Pytorch

    最近在写论文 xff0c 要做一些对比实验 xff0c 需要以Sphereface为基础 其实实验早该做了 xff0c 就是一直拖拖拖 唉拖延症患者 今天总算是把github上的代码跑通了 xff0c 赶紧做下小笔记 因为还要赶论文 xff
  • mysql学习-9.如何正确的使用索引

    1 索引的规则 1 1 等值匹配 假设索引 A select from table where A 61 xxx就是走索引的 1 2 最左侧列匹配 假设索引 A B select from table where A 61 xxx and
  • Python/matplotlib之【RuntimeWarning: More than 20 figures have been opened】

    Python matplotlib之 RuntimeWarning More than 20 figures have been opened 当绘图的过程中 xff0c 建立了大量的figure xff0c 就会报错 解决的方法 xff0
  • 【学习】《软件工程》期末考试卷A+参考答案

    2021 福师网院 软件工程 2020年期末考试卷A xff08 参考答案见底部 xff09 1 软件需求分析阶段的工作 xff0c 可以分为以下4个方面 xff1a 对问题的识别 分析与综合 编写需求分析文档以及 xff08 xff09
  • C#自定义控件

    一 开发环境和工具 1 WIN10系统 2 Visual Studio社区版 2019 xff08 C xff09 二 创建自定义控件窗体 添加一个自定义控件 xff0c 右键解决方案 xff0c 点击添加 xff0c 然后点击用户控件 选
  • vdo 虚拟数据优化器详解以及配置

    VDO 我的博客 xff1a https blog itwk cc vdo xff08 虚拟数据优化器 xff09 是一个内核模块 xff0c 目的是通过重删 xff08 重复数据删除 xff09 减少磁盘的的空间占用 xff0c 以及减少
  • ROS 自定义消息类型方法

    流程 1 在package中新建文件夹名为msg 2 在msg文件夹中创建消息 xff08 此处以my msg msg xff09 为例 xff0c 注意的是要以msg为后缀名 内容举例如下 xff1a int32 data1 float6
  • 计算机网络第七版笔记--第一章

    第一章概述 1 1 计算机网络在信息时代中的作用 1 互联网是覆盖全球的 xff0c 具有两个重要基本特点 xff0c 即连通性和共享 1 2互联网的概述 1 2 1网络的网络 1 计算机网络 xff08 简称网络 xff09 由若干结点
  • 0.1+0.2不等于0.3 原因

    在计算机进行数字计算时会先将十进制转化为二进制进行计算 xff0c 由于二进制表示的有限数字不能超过 52 位在 JavaScript 里是不能精确存储的 xff0c 计算机进行了四舍五入这时造成了数字误差导致计算结果不为0 3 总结 xf
  • mac 终端 配置代理

    即使打开代理 xff0c mac终端默认不走 xff0c 需要配置 一 复制终端代理命令 export http proxy 61 http 127 0 0 1 1089 export https proxy 61 http 127 0 0
  • 【linux】安装Linux的交叉编译工具链

    1 linux中装软件的特点 linux中安装软件比windows中复杂 linux中安装软件一般有以下几种方法 xff1a 第一种 xff1a 在线安装 譬如ubuntu中使用apt get install vim来安装vim软件 第二种
  • 基于STM32F429 的 FreeRTOS 环境下 LCD1602驱动实现

    本文是基于STM32F429在FreeRTOS下的HAL库开发 xff0c 并验证在多任务不同优先级情况下运行情况 LCD1602介绍 xff1a 是一个只能显示字母 数字 符号的点阵型液晶模块 一行可以显示16个字符 xff0c 可以显示
  • 查询MYSQL和查询HBASE速度比较

    MySQL xff0c 关系型数据库 xff1b HBase xff0c NoSql数据库 查询Mysql和查询HBase xff0c 到底哪个速度快呢 xff1f 与一些真正的大牛讨论时 xff0c 他们说HBase写入速度 xff0c
  • Office Online Server 在线编辑Office文档,安装部署

    最近公司项目需求 xff0c 需要搭建一个office预览编辑的服务 xff0c 在网上找到了Office Online Server在线编辑office文档 xff0c 以下把自己搭建过程记录 一 Office Online Server
  • 安装vmware搭建k8s集群(亲试无坑)

    一 前言 下面这个坑我也遇到了 xff0c 同时看到别人的博客也遇到了 xff0c 害的我废了一天的时间来解决这个问题 xff0c 但是毫无卵用 xff0c 气的我快吐血 xff1a 问题 xff1a 因为k8s把版本的问题 xff0c 一
  • Kaniko构建镜像

    一 前言 最近公司重构devops相关的一系列平台 xff0c 对于流水线中用容器方式交付的产品越来越多 xff0c 为了更加安全的方式来构建容器镜像 xff0c 采用Kaniko构建 在了解如何用Kaniko构建镜像之前 xff0c 我们