Kaniko 构建镜像
一、Kaniko简介
Kaniko 是一个开源工具,用于在容器内部构建 Docker 镜像。它的设计初衷是在不需要使用 Docker 守护进程或特权访问的情况下构建镜像。
使用 Kaniko 构建镜像的步骤如下:
-
准备构建上下文:将构建所需的文件和目录放置在一个目录中作为构建上下文。通常,你会将 Dockerfile 文件与应用程序代码一起放在同一个目录中。
-
创建并配置 Kaniko 配置文件:创建一个名为 config.json 的配置文件,用于配置 Kaniko 的参数和选项。例如,你可以指定要构建的 Dockerfile 的路径、输出镜像的名称和标签等。
-
运行 Kaniko 构建命令:在终端中运行以下命令来使用 Kaniko 构建镜像:
kaniko --context <path-to-context> --dockerfile <path-to-dockerfile> --destination <image-name>:<tag>
将 替换为构建上下文的路径, 替换为 Dockerfile 的路径,: 替换为要生成的镜像的名称和标签。
Kaniko 将会读取构建上下文中的文件,并在容器内部基于指定的 Dockerfile 构建镜像。构建过程完全在容器内完成,无需依赖本地的 Docker 守护进程。
-
等待构建完成:根据你的镜像大小和复杂度,构建过程可能需要一些时间。在构建过程中,Kaniko 将显示相关的日志信息,以便你跟踪构建进度和检查错误。
-
检查构建结果:构建完成后,你可以使用以下命令查看生成的镜像列表:
docker images
在列表中,你应该能够看到使用 Kaniko 构建的镜像及其相关信息。
k8s环境构建
在 Kubernetes 中使用 Kaniko 构建镜像的完整流程如下:
-
准备 Kubernetes 集群:
首先,你需要准备一个运行中的 Kubernetes 集群,并确保你具备访问和管理集群的权限。 -
创建 Kaniko 的构建配置文件 Secret:
为了将构建上下文传递给 Kaniko 容器,并允许其推送镜像到镜像仓库,我们需要创建一个包含镜像仓库凭据的 Secret 对象。这个 Secret 将在构建 Pod 中被挂载并提供给 Kaniko。
假设你的镜像仓库是基于 Docker Hub 的,你可以创建一个名为 kaniko-secret.yaml 的 YAML 文件,并填入以下内容:
apiVersion: v1
kind: Secret
metadata:
name: kaniko-secret
type: kubernetes.io/dockerconfigjson
data:
.dockerconfigjson: <base64-encoded-dockerconfigjson>
将 <base64-encoded-dockerconfigjson>
替换为经过 base64 编码的包含 Docker Hub 凭据的 .dockerconfigjson 文件内容。
然后,使用以下命令创建 Secret 对象:
kubectl apply -f kaniko-secret.yaml
- 创建 Kaniko 的构建 Pod:
接下来,我们需要创建一个构建 Pod,用于在 Kubernetes 中运行 Kaniko 容器,并执行镜像构建操作。
创建一个名为 kaniko-build-pod.yaml 的 YAML 文件,并填入以下内容:
apiVersion: v1
kind: Pod
metadata:
name: kaniko-build-pod
spec:
containers:
- name: kaniko
image: gcr.io/kaniko-project/executor:v1.6.0
volumeMounts:
- name: context
mountPath: /workspace
- name: docker-config
mountPath: /kaniko/.docker
volumes:
- name: context
emptyDir: {}
- name: docker-config
secret:
secretName: kaniko-secret
这个 Pod 包含一个名为 kaniko 的容器,使用 Kaniko 的官方镜像 gcr.io/kaniko-project/executor:v1.6.0。同时,我们挂载了两个卷,一个用于构建上下文 /workspace,另一个是用于提供镜像仓库凭据的 .docker 目录。
使用以下命令创建构建 Pod:
kubectl apply -f kaniko-build-pod.yaml
-
等待构建 Pod 完成:
构建 Pod 将在 Kubernetes 中启动,并开始运行 Kaniko 容器来执行镜像构建操作。你可以使用以下命令来查看构建 Pod 的状态:kubectl get pod kaniko-build-pod
当 Pod 的状态为 Running 且 READY 列显示为 1/1 时,表示构建 Pod 已经成功启动。
-
检查构建日志和结果:
你可以使用以下命令查看构建 Pod 的日志:kubectl logs kaniko-build-pod
Kaniko 将会显示构建过程中的相关日志信息。
构建完成后,你可以使用以下命令查看生成的镜像列表:
kubectl exec -it kaniko-build-pod -- docker images
在列表中,你应该能够看到使用 Kaniko 构建的镜像及其相关信息。
这就是在 Kubernetes 中使用 Kaniko 构建镜像的完整流程。请确保你的 Kubernetes 集群已正确配置,并且 Kaniko 和相关资源已正确部署。
二、实战
kaniko的工作方式
1.读取指定的Dockerfile。
2.将基本映像(在FROM指令中指定)提取到容器文件系统中。
3.在独立的Dockerfile中分别运行每个命令。
4.每次运行后都会对用户空间文件系统的做快照。
5.每次运行时,将快照层附加到基础层。
kaniko工作原理
kaniko作为一个容器镜像运行,它接受三个参数:一个 Dockerfile ,一个构建上下文以及将镜像推送到的注册表。它在执行程序镜像中提取基本镜像的文件系统。然后,在Dockerfile中执行任何命令,快照用户空间中的文件系统。Kaniko在每个命令后都会将一层已更改的文件附加到基本镜像。最后,执行程序将新镜像推送到指定的注册表。由于Kaniko在执行程序镜像的用户空间中完全执行了这些操作,因此它完全避免了在用户计算机上需要任何特权访问。
kaniko重复拉取镜像问题
使用kaniko来构建镜像,,可以缓存镜像,但在dockerfile中使用copy等命令时会发生 Unpacking rootfs as cmd COPY . . requires it
.,每次都要拉镜像,需要更好的科学环境,不然很慢。需要要gcr.io, docker.com, docker.io都使用代理访问。
处理方式
手动拉取镜像到服务节点本地
dockerfile 文件:
/workspace # cat dockerfile
FROM demo-harbor.demo.com/kylinv10/arm-py311-java:v1.0.2
RUN curl --retry-max-time 1800 --connect-timeout 1800 --retry 40 -L -C - "http://magicsvc-api-svc.demo.svc.cluster.local:8785/download?delete_flag=1&url=static/tmp/26125_11721753225.tar.gz"|tar xz
vf - -C /app
WORKDIR /app
RUN pip install -r requirements.txt --no-index -f src/dependency/ && rm -rf src/dependency/
#[install_tools]
# Define environment variable
ENV MODEL_NAME lightgbm_model
ENV SERVICE_TYPE MODEL
ENV GRPC_WORKERS 0
ENV GUNICORN_MAX_REQUESTS_JITTER 200
#COPY --chown=65500:65500 #[application.properties] /home/master/online
#COPY --chown=65500:65500 deployment/template/hystrix.properties /home/master/online
# seldon-core replace
RUN ln -s /app/modelfunc /home/master/python3/lib/python3.11/site-packages/modelfunc \
&& rm -rf /home/master/python3/lib/python3.11/site-packages/seldon_core/seldon_methods.py \
&& rm -rf /home/master/python3/lib/python3.11/site-packages/seldon_core/wrapper.py \
&& cp -f /app/modelfunc/seldon_methods.py* /home/master/python3/lib/python3.11/site-packages/seldon_core/ \
&& cp -f /app/modelfunc/wrapper.py* /home/master/python3/lib/python3.11/site-packages/seldon_core/ \
&& echo '{"model_id": "26125", "md5": "994490bfff9d42e78886f5a41a22b6d0-20240724005002", "version": "1"}' > /home/master/md5
CMD (seldon-core-microservice $MODEL_NAME --service-type $SERVICE_TYPE &);java -jar gun-0.0.1-SNAPSHOT.jar/workspace #
/workspace #
手动拉取镜像:
# 手动拉取镜像
sudo docker pull demo-harbor.demo.com/library/executor-arm:v1.22.0-debug
sudo docker pull demo-harbor.demo.com/kylinv10/arm-py311-java:v1.0.2 # 手动拉取镜像,该镜像比较大,需要手动拉取 4.97G, 在构建时超时了;
——
参考链接:
https://github.com/GoogleContainerTools/kaniko
https://blog.csdn.net/weixin_38320674/article/details/107650424
https://www.bianchengquan.com/article/511721.html
相关文章:
docker镜像构建工具kaniko构建过程缓慢原因探究
为者常成,行者常至
自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)