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