Docker 化的 Java 项目还可以在基础镜像添加什么工具?

2019-03-04 20:05:26 +08:00
 doggg

面对 Docker 话的 JAVA 项目,一个很头疼的问题就是 Maven 依赖,我制作了一个基础镜像将多个项目使用的公共依赖( Spring-Boot、Apache 等)添加到基础镜像中,做法是使用 Dockerfile + pom.xml 实现,以往走一次 CI 30 分钟,现在只需要 6 分钟以下,大部分时间是花在向公仓拉取 jar 包。我还在想应该在这个基础镜像添加什么依赖来提高生产 debug 效率。

2883 次点击
所在节点    Java
19 条回复
jhsea3do
2019-03-04 20:12:06 +08:00
有点不清楚,你的容器应该和 maven 没有关系 ,我觉你需要准备

1. m2 私服
2. 使用 ci 工具 maven package
3. 使用 ci 工具 docker build
doggg
2019-03-04 20:17:18 +08:00
@jhsea3do 我们的构建方式是将代码拉入容器内部打包,避免在容器打包造成对容器外部的依赖。比如说在容器外部打包就需要该机器有 Maven 等工具。
doggg
2019-03-04 20:18:27 +08:00
另外因为数据库的 schema 用 alembic,所以在基础镜像的 Dockerfile 也添加了使用 agp-get 的方式来安装 alembic.
Cbdy
2019-03-04 20:20:32 +08:00
-v /root/.m2:~/.m2
doggg
2019-03-04 20:22:44 +08:00
@Cbdy 绑定了 HOST 机器需要 maven 环境。跑 Docker 的机器可能没有 Maven 环境。
ysicing
2019-03-04 20:28:16 +08:00
内部搭建一个缓存服务如私服 artifactory,用来缓存 jar
cbwleft
2019-03-04 20:34:05 +08:00
如果只是打包的话 Google Jib 应该够用。
如果需要方便线上定位问题的话,可以考虑用 ali 的 arthas。
whe
2019-03-04 21:01:57 +08:00
看一下 layer caching 和 multi-stage build
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 了,为啥还要现场下依赖呢…
hahahe
2019-03-04 21:39:02 +08:00
你这头像让我笑半天……
doggg
2019-03-04 21:45:13 +08:00
@chendy 已经回复过了,我想对执行的机器造成 Maven 依赖绑定。Maven 都是使用容器内的 Maven。因为 CI 体系已经完成,不可能因为某个人的需求导致所有人都要更改。
sampeng
2019-03-04 22:39:10 +08:00
@doggg 没太明白为什么一定会要用 docker 里面的 maven。没有这样使用的价值啊… jar 包在哪下不是下…就算一定要这样。那就 ci 集群自己用自己的私有仓库。这是一个办法。另一个就是 nfs 目录了… dockerfile 里面把 maven 复制进去

k8s 中 master+slave 的 jenkins 打包方式也可以很好的解决。反正每个 pod 用完就释放了。maven 下载地址用 nfs 共享…
sampeng
2019-03-04 22:41:10 +08:00
@doggg 而且你如此反而不太好。在基础镜像里面固定下来,那不一改需求就要重新做一次?每隔几个月休整一下基础镜像?
doggg
2019-03-05 08:52:48 +08:00
@sampeng
不用 docker 里的容器,会造成其他语言的开发者( Go ),电脑也要安装 Maven。

目前每周基础镜像确实会更新一次(后面会是月级别)。基础镜像在 github 维护一个仓库,还没问运维用 webhook 是否能完成镜像重做。
sampeng
2019-03-05 12:20:39 +08:00
@doggg 开发人员机器就不要 maven 了?再说了…开发机要啥 docker ……怎么简单怎么来。增加了开发人员心智抵达呢,也增加了运维管理负担。没看着有好处啊
sampeng
2019-03-05 12:21:43 +08:00
@doggg 我感觉你是打算开发了也打包后再测试…个人觉得会被开发骂死的…太慢了
jakehu
2019-03-05 13:59:45 +08:00
gitlab+gitlab runner(Maven 装在这台服务器)+docker,我是这样做的,结合 K8s-api 自动更新,最多不过 10s 有时 6-7S 搞定
jakehu
2019-03-05 14:01:48 +08:00
公共(自有)jar 包的解决方案就是利用 ci 直接在 runner 服务器上 mvn install 安装在 runner 上,其他模块打包时就会自动引用
doggg
2019-03-05 19:40:01 +08:00
@whe Great! multi-stage 看起来是个很有意思的东西,代码打包是一个容器,打包完放在另外一个容器(不包含打包的环境,软件等)

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/541004

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX