本文以golang语言为例,介绍下缓存目录的映射,其他语言例如nodejs的npm也存在类似的问题。
一、概述
在使用Gitlab CICD构建Docker镜像的过程中,我们一般会采用DooD或者DinD的方式来运行runner,无论哪一种方式,Docker环境都是全新的场景,没有缓存;这是优点也是缺点,优点是环境干净不会有干扰因素,缺点也很明显,没有缓存,所有的依赖包都要重新下载,要是遇上网络环境不好,构建都需要好几个小时。
但是DooD比DinD有个优势,就是可以挂载宿主机的目录进行共享,特别适合需要下载包的缓存目录。
二、Gitlab Runner中设置目录共享
我们以DooD为例,要实现在Runner容器中挂载镜像,需要在gitlab-runner的配置中进行设置。
配置文件 /etc/gitlab-runner/config.toml
其中的volume字段设置成如下:
volumes = ["/var/run/docker.sock:/var/run/docker.sock", "/cache", "/data/cache/go/pkg/mod/:/go/pkg/mod/"]
然后需要重启gitlab-runner
systemctl restart gitlab-runner
三、效果
我们从宿主机目录中可以看到已经缓存的包,构建过程确实节省了不少。
四、各种语言缓存目录
golang:1.18 官方镜像中GOPATH="/go",他的包缓存目录是:$GOPATH/pkg/mod 。
node:18 官方镜像中,npm缓存目录是 cache = "/root/.npm" 。