面对 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 2019-03-04 20:34:05 +08:00 1
如果只是打包的话 Google Jib 应该够用。
如果需要方便线上定位问题的话,可以考虑用 ali 的 arthas。 |
8
whe 2019-03-04 21:01:57 +08:00 via iPhone 1
看一下 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 1
公共(自有)jar 包的解决方案就是利用 ci 直接在 runner 服务器上 mvn install 安装在 runner 上,其他模块打包时就会自动引用
|