Docker 化的 Java 项目还可以在基础镜像添加什么工具? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
doggg
V2EX    Java

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

  •  
  •   doggg
    vm-001 2019-03-04 20:05:26 +08:00 3497 次点击
    这是一个创建于 2420 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    19 条回复    2019-03-05 19:40:01 +08:00
    jhsea3do
        1
    jhsea3do  
       2019-03-04 20:12:06 +08:00
    有点不清楚,你的容器应该和 maven 没有关系 ,我觉你需要准备

    1. m2 私服
    2. 使用 ci 工具 maven package
    3. 使用 ci 工具 docker build
    doggg
        2
    doggg  
    OP
       2019-03-04 20:17:18 +08:00
    @jhsea3do 我们的构建方式是将代码拉入容器内部打包,避免在容器打包造成对容器外部的依赖。比如说在容器外部打包就需要该机器有 Maven 等工具。
    doggg
        3
    doggg  
    OP
       2019-03-04 20:18:27 +08:00
    另外因为数据库的 schema 用 alembic,所以在基础镜像的 Dockerfile 也添加了使用 agp-get 的方式来安装 alembic.
    Cbdy
        4
    Cbdy  
       2019-03-04 20:20:32 +08:00 via Android
    -v /root/.m2:~/.m2
    doggg
        5
    doggg  
    OP
       2019-03-04 20:22:44 +08:00
    @Cbdy 绑定了 HOST 机器需要 maven 环境。跑 Docker 的机器可能没有 Maven 环境。
    ysicing
        6
    ysicing  
       2019-03-04 20:28:16 +08:00 via Android
    内部搭建一个缓存服务如私服 artifactory,用来缓存 jar
    cbwleft
        7
    cbwleft  
       2019-03-04 20:34:05 +08:00   1
    如果只是打包的话 Google Jib 应该够用。
    如果需要方便线上定位问题的话,可以考虑用 ali 的 arthas。
    whe
        8
    whe  
       2019-03-04 21:01:57 +08:00 via iPhone   1
    看一下 layer caching 和 multi-stage build
    chendy
        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 了,为啥还要现场下依赖呢…
    hahahe
        10
    hahahe  
       2019-03-04 21:39:02 +08:00
    你这头像让我笑半天……
    doggg
        11
    doggg  
    OP
       2019-03-04 21:45:13 +08:00
    @chendy 已经回复过了,我想对执行的机器造成 Maven 依赖绑定。Maven 都是使用容器内的 Maven。因为 CI 体系已经完成,不可能因为某个人的需求导致所有人都要更改。
    sampeng
        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 共享…
    sampeng
        13
    sampeng  
       2019-03-04 22:41:10 +08:00 via iPhone
    @doggg 而且你如此反而不太好。在基础镜像里面固定下来,那不一改需求就要重新做一次?每隔几个月休整一下基础镜像?
    doggg
        14
    doggg  
    OP
       2019-03-05 08:52:48 +08:00
    @sampeng
    不用 docker 里的容器,会造成其他语言的开发者( Go ),电脑也要安装 Maven。

    目前每周基础镜像确实会更新一次(后面会是月级别)。基础镜像在 github 维护一个仓库,还没问运维用 webhook 是否能完成镜像重做。
    sampeng
        15
    sampeng  
       2019-03-05 12:20:39 +08:00 via iPhone
    @doggg 开发人员机器就不要 maven 了?再说了…开发机要啥 docker ……怎么简单怎么来。增加了开发人员心智抵达呢,也增加了运维管理负担。没看着有好处啊
    sampeng
        16
    sampeng  
       2019-03-05 12:21:43 +08:00 via iPhone
    @doggg 我感觉你是打算开发了也打包后再测试…个人觉得会被开发骂死的…太慢了
    jakehu
        17
    jakehu  
       2019-03-05 13:59:45 +08:00
    gitlab+gitlab runner(Maven 装在这台服务器)+docker,我是这样做的,结合 K8s-api 自动更新,最多不过 10s 有时 6-7S 搞定
    jakehu
        18
    jakehu  
       2019-03-05 14:01:48 +08:00   1
    公共(自有)jar 包的解决方案就是利用 ci 直接在 runner 服务器上 mvn install 安装在 runner 上,其他模块打包时就会自动引用
    doggg
        19
    doggg  
    OP
       2019-03-05 19:40:01 +08:00
    @whe Great! multi-stage 看起来是个很有意思的东西,代码打包是一个容器,打包完放在另外一个容器(不包含打包的环境,软件等)
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2414 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 15:42 PVG 23:42 LAX 08:42 JFK 11:42
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86