V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
doggg
V2EX  ›  Java

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

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

    面对 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   ·   实用小工具   ·   5345 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 36ms · UTC 08:42 · PVG 16:42 · LAX 00:42 · JFK 03:42
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.