前言

前一篇文章【云原生之旅 - 11)基于 Kubernetes 动态伸缩 Jenkins Build Agents】有讲到在 Kubernetes Pod (Jenkins build agent) 里面构建 docker 容器镜像,当时我们采取了一种简单快速的方式来 run docker in docker,也就是 mount /var/run/docker.sock 到主机的 docker engine,这需要docker run在特权 privileged 模式下,有很大的安全隐患。另外这种方式还有个很大的缺陷就是当一台机器上同时运行多个docker build agent时,会出现阻塞的情况,因为这一批agent用的都是宿主机上的同一个docker engine。

所以我们今天介绍一款专门用于Kubernetes 构建容器镜像的工具 Kaniko,它是 Google 创建的一个开源工具. 并且不需要 privileged access to the host,解决了前一种方式的缺陷。
 
关键词:使用Kaniko构建容器镜像,Run docker in docker,  在 Kubernetes上构建 Docker 容器镜像,无需特权在Kubernetes中构建镜像,docker privileged,更安全的方式构建容器镜像
 
### 本文同步发表于知乎 https://zhuanlan.zhihu.com/p/584805862
 

原理

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

准备

我们需要在Kubernetes 里创建一个 docker-registry 类型的 secret,后面会挂载到 kaniko container,这样kaniko才有权限push image到Docker Hub registry
kubectl -n jenkins create secret docker-registry dockercred \
--docker-server=https://index.docker.io/v1/ \
--docker-username=<dockerhub-username> \
--docker-password=<dockerhub-password>

使用 Kaniko 构建镜像

Define kaniko container in Pod Template

并且挂载刚才建的 docker-registry类型的secret

kind: Pod
spec:
containers: # list of containers that you want present for your build, you can define a default container in the Jenkinsfile
- name: kaniko
image: gcr.io/kaniko-project/executor:v1.9.0-debug # include shell
imagePullPolicy: IfNotPresent
command:
- /busybox/cat
tty: true
resources:
limits:
cpu: 500m
memory: 1024Mi
volumeMounts:
- name: kaniko-secret
mountPath: /kaniko/.docker
volumes:
- name: kaniko-secret
secret:
secretName: dockercred
items:
- key: .dockerconfigjson
path: config.json

Jenkins pipeline

  • --context: This is the location of the Dockerfile.
  • --destination: You need to replace Docker Hub username `wadexu007` with your Docker Hub username for kaniko to push the image to the Docker Hub registry.
pipeline {
options {
timeout(time: 10, unit: 'MINUTES')
buildDiscarder(logRotator(numToKeepStr: '10', daysToKeepStr: '7'))
} agent {
kubernetes {
idleMinutes 3 // how long the pod will live after no jobs have run on it
yamlFile 'Jenkins/kaniko-demo/build-pod.yaml' // path to the pod definition relative to the root of our project
}
}

stages {
stage('Kaniko Build and Push Docker Image') {
steps {
script {
dir('Jenkins/kaniko-demo') {
container('kaniko') {
sh """
/kaniko/executor --context `pwd` --destination wadexu007/demo-app:1.0.5
"""
}
}
}
}
} }
}

完整例子参考我的 Github Repo

### 本文同步发表于知乎 https://zhuanlan.zhihu.com/p/584805862

测试

创建一个Pipeline job

Repository URL = https://github.com/wadexu007/learning_by_doing

Script Path = Jenkins/kaniko-demo/Jenkinsfile

Click `Build now`

感谢阅读,如果您觉得本文的内容对您的学习有所帮助,您可以打赏和推荐,您的鼓励是我创作的动力

### 本文同步发表于知乎 https://zhuanlan.zhihu.com/p/584805862

最新文章

  1. mysql中,主键与普通索引
  2. iOS 串行网络请求。。。待研究
  3. U-boot.lds文件分析
  4. QQ Auto Login Visual Basic Script
  5. 【英语】Bingo口语笔记(28) - 表示“秘密”
  6. 找不到类型或命名空间 datarowview
  7. Java中Map的使用
  8. ERROR 1372 (HY000): Password hash should be a 41-digit hexadecimal number;
  9. [转]UltraISO制作U盘启动盘安装Win7/9/10系统攻略
  10. mfc---单文档工程添加消息响应
  11. button的用法
  12. 大数据 --&gt; 分布式服务框架Zookeeper
  13. Mac电脑上一款非常时尚高清的动态壁纸Living Wallpaper HD
  14. Raize 重新编译
  15. JAVA课程设计-教学论坛系统
  16. 编译安装php5.6
  17. git与eclipse集成之代码提交
  18. [20171106]修改show spparameter的显示宽度.txt
  19. javascript: break跳出多重循环以及退出each循环
  20. 注释和取消注释 程序中的log日志

热门文章

  1. Helm安装ingress-nginx-4.2.3
  2. springMVC配置时,静态资源和jsp文件路径没错但是访问时controller的请求报404错误。
  3. 华南理工大学 Python第7章课后小测-2
  4. Python数据分析教程(一):Numpy
  5. AlertManager 何时报警
  6. 官方文档----ProxySQL 1.4.2 现在支持原生集群!!!
  7. 获取 Docker 容器的 PID 号
  8. 0-mysql数据库下载及安装
  9. 【Serverless】云函数微信小程序
  10. SQL的表的连接Left Join / Right Join /inner join相关