【kaniko】在k8s中构建docker镜像
背景
在某些场景中,我需要使用一个应用中去动态的构建一个docker镜像。而一般VM基础设施比较健全时,应用程序理论上也会运行在虚拟容器中。所以这时会产生一个需求,就是在容器中创建镜像。最常见的就是在k8s的pod中创建、发布镜像
序
参考:https://devopscube.com/build-docker-image-kubernetes-pod/
对于docker in docker该方案有两个缺点
- 需要使用高级权限,容易被恶意攻击
- k8s在未来可能不支持docker
开始
这里提供的方案叫做Kaniko
kaniko不需要高级权限,它的工作原理是:
- kaniko提供一个专用的镜像:gcr.io/kaniko-project/executor。这个镜像只提供一些静态的go的二进制文件,和一些基础的推拉镜像功能
- kaniko接收3个参数: Dockerfile,构建镜像所需的资源等及用于推送镜像的远程仓库
- 部署时,kaniko读取Dockerfile,并且根据FROM关键字去提取基础镜像
- 然后根据Dockerfile的命令进行快照
- 在完成每个快照后,kaniko只会将一些更新操作追加到基础镜像中
- 最终将生成的镜像推送到仓库
整个过程看起来跟我们平时构建镜像、推送的逻辑好像没什么太大的差别,但是kaniko抽取了最核心的构建和推送逻辑,阉割了其他不需要的职能,保证其安全性和便捷性。
根据官方介绍,构建镜像的资源支持:s3协议、本地文件夹、标准输入、git仓库等
步骤
apiVersion: v1 kind: Pod metadata: name: kaniko spec: containers: - name: kaniko image: wenyangchou/kaniko-project-executor:latest args: - "--context=git://github.com/scriptcamp/kubernetes-kaniko" - "--destination=10.13.68.15:5000/kaniko-demo-image:1.0" restartPolicy: Never
其中image使用官方的拉不下来,拉下来之后也启动不起来。所以这里找了一个代替的非官方镜像
问题
- 私有仓库认证
创建docker secret:
kc create secret generic kaniko-secret --namespace=phantom --from-file=/root/.docker/config.json
然后挂载到 /knaiko/.docker
创建git/ssh secret:
如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | apiVersion: v1 kind: Pod metadata: name: kaniko spec: containers: - name: kaniko image: wenyangchou/kaniko-project-executor:latest volumeMounts: - name: kaniko-secret mountPath: /kaniko/.docker/ args: - "--context=git://xxxx" - "--destination=xxxx" - "--dockerfile=dev/Dockerfile" - "--git=branch=dev" - "--insecure=true" - "--skip-tls-verify=true" restartPolicy: Never volumes: - name: kaniko-secret secret: secretName: kaniko-secret |
- git仓库认证
- context上下文
这个被官方文档带偏,容易产生误解。
以该项目为例: https://github.com/wenyangchou/kaniko-test
git拉取有两个地址: git@github.com:wenyangchou/kaniko-test.git 和 https://github.com/wenyangchou/kaniko-test.git
上下文乍一看可能觉得是:
--context=git@github.com:wenyangchou/kaniko-test.git
实际测试后发现,地址应该为https的
--context=https://github.com/wenyangchou/kaniko-test.git
正确做法如下:
apiVersion: v1 kind: Pod metadata: name: kaniko spec: containers: - name: kaniko image: wenyangchou/kaniko-project-executor:latest args: - "--context=git://github.com/wenyangchou/kaniko-test.git" - "--destination=10.13.68.15:5000/kaniko-test:v1" - "--dockerfile=docker/torch/Dockerfile" restartPolicy: Never
参数
- --dockerfile 和 --context-sub-path 区别
--dockerfile 构建目录为项目根目录,而 --context-sub-path为子文件夹目录
--dockerfile=docker/torch/Dockerfile相当于
docker build -t . -f docker/torch/Dockerfile
而--context-sub-path相当于
docker -t docker/torch -f docker/torch/Dockerfile
- --git
切换分支: 【仅供参考gitlab】
--git=branch=dev
如果使用--git=branch=dev,single-branch=false,recurse-submodules=false 会失败
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端