如何让k8s中的kaniko缓存项目依赖

如果我们想要在kaniko缓存composer vendor或者golang mod等程序依赖,我们需要把这些依赖存起来,一个简单的思路是使用pvc来解决。

假设我们使用的pipeline组件是tekton,那么,我们可以这么写我们的task

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
apiVersion: tekton.dev/v1beta1
kind: ClusterTask
metadata:
name: build-push-image
spec:
workspaces:
- name: output # 声明workspace
description: 传递工作区
params:
- name: workspace
description: git代码路径
type: string
- name: image
description: 镜像名字
type: string
- name: library-cache
description: 用于缓存依赖库的pvc
type: string
steps:
- name: build-push-image
image: hub.code-galaxy.net/library/kaniko-executor:v1.6.0
imagePullPolicy: IfNotPresent
args:
- --dockerfile=/workspace/output/$(params.workspace)/Dockerfile
- --context=/workspace/output/$(params.workspace)
- --destination=$(params.image)
- --insecure-pull # 如果不开启这个,则pull镜像的时候会访问443端口
- --insecure # 如果不开启这个,则push镜像的时候会访问443端口
- --skip-tls-verify
- --log-timestamp=true
- --push-retry=5
volumeMounts:
- name: library-cache
mountPath: /kaniko/library-cache
volumes:
- name: library-cache
persistentVolumeClaim:
claimName: $(params.library-cache)
readOnly: false

可以看到,我们把一个pvc挂载到了kaniko容器的/kaniko/library-cache目录里面。那么,我们就可以在Dockerfile里面利用这个持久化的目录:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
FROM hyperf/hyperf:7.4-alpine-v3.11-swoole
LABEL maintainer="Hyperf Developers <group@hyperf.io>" version="1.0" license="MIT" app.name="Hyperf"

WORKDIR /opt/www

RUN rm -rf /root/.composer
RUN ln -s /kaniko/library-cache /root/.composer

COPY . /opt/www
RUN composer install --no-dev -o && php bin/hyperf.php

EXPOSE 9501

ENTRYPOINT ["php", "/opt/www/bin/hyperf.php", "start"]

我们只需要把这个持久化的目录软链接到/root/.composer目录即可。这样,当composer install的时候,下载的依赖就会存在pvc里面,并且,下次我们可以接着使用它们。