面对 Docker 话的 JAVA 项目,一个很头疼的问题就是 Maven 依赖,我制作了一个基础镜像将多个项目使用的公共依赖( Spring-Boot、Apache 等)添加到基础镜像中,做法是使用 Dockerfile + pom.xml 实现,以往走一次 CI 30 分钟,现在只需要 6 分钟以下,大部分时间是花在向公仓拉取 jar 包。我还在想应该在这个基础镜像添加什么依赖来提高生产 debug 效率。
1 jhsea3do 2019-03-04 20:12:06 +08:00 有点不清楚,你的容器应该和 maven 没有关系 ,我觉你需要准备 1. m2 私服 2. 使用 ci 工具 maven package 3. 使用 ci 工具 docker build |
![]() | 2 doggg OP @jhsea3do 我们的构建方式是将代码拉入容器内部打包,避免在容器打包造成对容器外部的依赖。比如说在容器外部打包就需要该机器有 Maven 等工具。 |
![]() | 3 doggg OP 另外因为数据库的 schema 用 alembic,所以在基础镜像的 Dockerfile 也添加了使用 agp-get 的方式来安装 alembic. |
4 Cbdy 2019-03-04 20:20:32 +08:00 via Android -v /root/.m2:~/.m2 |
![]() | 6 ysicing 2019-03-04 20:28:16 +08:00 via Android 内部搭建一个缓存服务如私服 artifactory,用来缓存 jar |
7 cbwleft ![]() 如果只是打包的话 Google Jib 应该够用。 如果需要方便线上定位问题的话,可以考虑用 ali 的 arthas。 |
![]() | 8 whe 2019-03-04 21:01:57 +08:00 via iPhone ![]() 看一下 layer caching 和 multi-stage build |
![]() | 9 chendy 2019-03-04 21:02:44 +08:00 跑 spring-boot 的话可以参考官方的博客 https://spring.io/blog/2018/11/08/spring-boot-in-a-container spring-boot 本身就可以一波 fatjar 了,为啥还要现场下依赖呢… |
10 hahahe 2019-03-04 21:39:02 +08:00 你这头像让我笑半天…… |
![]() | 11 doggg OP @chendy 已经回复过了,我想对执行的机器造成 Maven 依赖绑定。Maven 都是使用容器内的 Maven。因为 CI 体系已经完成,不可能因为某个人的需求导致所有人都要更改。 |
12 sampeng 2019-03-04 22:39:10 +08:00 via iPhone @doggg 没太明白为什么一定会要用 docker 里面的 maven。没有这样使用的价值啊… jar 包在哪下不是下…就算一定要这样。那就 ci 集群自己用自己的私有仓库。这是一个办法。另一个就是 nfs 目录了… dockerfile 里面把 maven 复制进去 k8s 中 master+slave 的 jenkins 打包方式也可以很好的解决。反正每个 pod 用完就释放了。maven 下载地址用 nfs 共享… |
13 sampeng 2019-03-04 22:41:10 +08:00 via iPhone @doggg 而且你如此反而不太好。在基础镜像里面固定下来,那不一改需求就要重新做一次?每隔几个月休整一下基础镜像? |
![]() | 14 doggg OP @sampeng 不用 docker 里的容器,会造成其他语言的开发者( Go ),电脑也要安装 Maven。 目前每周基础镜像确实会更新一次(后面会是月级别)。基础镜像在 github 维护一个仓库,还没问运维用 webhook 是否能完成镜像重做。 |
15 sampeng 2019-03-05 12:20:39 +08:00 via iPhone @doggg 开发人员机器就不要 maven 了?再说了…开发机要啥 docker ……怎么简单怎么来。增加了开发人员心智抵达呢,也增加了运维管理负担。没看着有好处啊 |
![]() | 17 jakehu 2019-03-05 13:59:45 +08:00 gitlab+gitlab runner(Maven 装在这台服务器)+docker,我是这样做的,结合 K8s-api 自动更新,最多不过 10s 有时 6-7S 搞定 |
![]() | 18 jakehu 2019-03-05 14:01:48 +08:00 ![]() 公共(自有)jar 包的解决方案就是利用 ci 直接在 runner 服务器上 mvn install 安装在 runner 上,其他模块打包时就会自动引用 |