Docker多阶段构建还是gitlab runner
有些Docker镜像的生成有时候分为多个阶段,如:
- 构建阶段:maven将java源代码转为jar
- 运行阶段:tomcat运行jar
可以看到构建阶段需要依赖于maven,运行阶段需要依赖于tomcat。为了减小镜像大小,理想的镜像是仅包含运行环境的tomcat而不包含编译打包环境maven的镜像。
这时候有两种方式可以实现该目的。
方式一:使用gitlab runner的Docker excutor构建
1 | stages: |
通过runner启动一个maven容器,在maven容器中将java源代码转为jar,然后使用dind技术将jar放入tomcat镜像,这时候就得到tomcat + jar的镜像。
方式二:使用docker的多阶段构建
1 | # 构建阶段 |
将生成jar逻辑放在Dockerfile中,先用maven镜像生成jar,得到一个maven + jar的镜像,然后使用tomcat镜像将刚刚生成的镜像中的jar复制过来,得到一个tomcat + jar的镜像。
二者的区别就是生成jar的逻辑是写在gitlab的.gitlab-ci.yml中还是写在Dockerfile中。
我个人倾向写在Dockerfile中,主要有一下几点考量。
- gitlab runner专注cicd如git push触发钩子、ssh、测试、发布,运行脚本等宏观的事情,细节交给其他工具来做,如Dockerfile负责构建镜像、docker-compose负责挂载和网络。
- 减少对gitlab runner的依赖,即使没有gitlab runner也能通过
Docker build命令构建镜像 - 可利用Docker layer的缓存,加快镜像构建速度。