关于容器构建方式优劣的疑惑 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
wxsm
V2EX    程序员

关于容器构建方式优劣的疑惑

  •  1
     
  •   wxsm
    wxsms 2020-07-10 10:49:09 +08:00 3520 次点击
    这是一个创建于 1968 天前的主题,其中的信息可能已经有所发展或是发生改变。

    方式 1:容器构建时就将代码导入好,并安装好依赖,部署时可以做到开箱即用。 方式 2:仅构建一个空白容器,并写好启动脚本。由 CI 负责打包并上传代码,部署时根据启动脚本拉取代码并安装依赖,然后再启动。

    方式 1 在 CI 要花费更长时间。方式 2 在 CD 要花费更长时间,而且部署时存在不确定性(代码拉不下来,安装依赖失败等)。目前我司用的是方式 2 来完成 k8s 部署,但我觉得这并没有真正利用到容器的所有优势( CI/CD 架构并不是我设计的,我只是负责将部分项目接入)。我个人认为方式 1 才是正确的。是这样的吗?

    24 条回复    2020-07-10 15:29:50 +08:00
    pomelo11
        1
    pomelo11  
       2020-07-10 11:00:09 +08:00
    目前公司的 ci/cd 采用的是方式 1,项目的 ci/cd 根据项目本身的大小决定的,方式 2 没有试过
    wangking
        2
    wangking  
       2020-07-10 11:02:19 +08:00
    一般是 1,
    fivesmallq
        3
    fivesmallq  
       2020-07-10 11:07:00 +08:00   1
    当然是 1,可重用的镜像不应该再有太多的外部过程,应该是直接可用的
    suom
        4
    suom  
       2020-07-10 11:08:38 +08:00
    用方式一。方式一保证了环境和代码的一致性。


    而且最好:构建成功的镜像用当前时间或者流水 ID 打上 tag 。线上万一出问题要回滚,直接按照 tag 回滚。
    MOETAN0
        5
    MOETAN0  
       2020-07-10 11:10:36 +08:00
    1 才真正符合容器设计目的之一:环境一致性。
    以及,对 1 的过程做好分层优化,比如充分利用 layer cache,那么也可以大幅度提高 CD 阶段的效率。
    lenqu
        6
    lenqu  
       2020-07-10 11:24:25 +08:00
    二其实也可以,看自己所用的生态环境是否完备,不完备自己是否有能力实现一个完备的生态环境?
    Kilerd
        7
    Kilerd  
       2020-07-10 11:27:03 +08:00
    当然是 1 。
    idblife
        8
    idblife  
       2020-07-10 11:29:18 +08:00
    我们用的是 2,想换成 1
    vinsec
        9
    vinsec  
       2020-07-10 11:52:50 +08:00
    Golang 项目其实 1 和 2 差不太多. 目前用的是 1 CI 过程 Jenkins+Dockerfile,根据当前 Build ID 打 tag 并 push 到内网 hrabor 上, 构建完毕同时触发 CD 通过 Jenkins API 获取最新一次构建成功的 Build ID,作为 tag 从 harbor 拉镜像 停止旧容器 启动新容器. 目前是一个小规模的项目这么做的
    wangritian
        10
    wangritian  
       2020-07-10 11:53:32 +08:00
    公司 php web 项目,我创建了 2 个镜像仓库,base (仅包含项目依赖,构建时使用方式 2 远程拉取)和 service ( FROM base,仅包含业务代码,构建时复制到指定目录),项目的新功能需要添加依赖时,更新 base 镜像,service
    镜像业务代码更新频率很高,但体积小,打包快,又有一个可控的 base 依赖镜像
    optional
        11
    optional  
       2020-07-10 11:56:01 +08:00
    当然实 1,ship 是 docker 的最大优点。
    2 其实是把容器当成虚拟机在用了。
    optional
        12
    optional  
       2020-07-10 11:57:07 +08:00
    而且 1 并没有在 CI 的时候多花费多少,Dockerfile 写得好,用上 multi stage builder,可以缓存大部分步骤的。
    koolob
        13
    koolob  
       2020-07-10 12:20:37 +08:00
    1 是对的。Dockerfile 最后的部分去导入代码。这样之前的层都是缓存了,不会花费更长时间。每一个代码版本就出一个镜像版本。然后部署时,可以根据版本号爱部署哪个镜像就部署哪个镜像。
    maemual
        14
    maemual  
       2020-07-10 12:27:36 +08:00
    正常人都是用 1 吧,用 2 的优点是什么?
    hantsy
        15
    hantsy  
       2020-07-10 12:36:04 +08:00
    一套流程都可以在 CI 服务器上,比如 Github Actions,CircleCI,SemaphoreCI,Codefresh 等:

    1. PR Build: Clone, Compile, 运行测试所有的测试代码(单元测试,集成测试),确定全部通过。(此过程反复 Refactor,Code Review )

    2. PR Merge 到 Master, 开始(或者指定特定 Event,或者 Tag ) Build Docker Image, (有些场景,会加入一个容器环境运行的纯 Client 端的功能测试),然后上传到 docker hub, 或者私有 Register 。

    3. 比如 Github Tag 等特定事件(有的 CI 可以人工决定,手动触发),生产环境( K8s )容器更新。(有一些 CI 云服务本身就是集成了 CD 部署(多个 K8s ),一键部署)

    项目自动化很好,但前提一定要做是自动化测试,国内测试都没有的,谈自动化只能用呵呵两字。
    hantsy
        16
    hantsy  
       2020-07-10 12:42:45 +08:00
    @optional 我用 Mutil Stage Builder 主要应对一些没办法的事,很多环境在本地机测试有困难,直接把整个编译过程放到容器内。
    swulling
        17
    swulling  
       2020-07-10 12:43:59 +08:00 via iPhone
    没听说过用 2 的
    hantsy
        18
    hantsy  
       2020-07-10 13:01:02 +08:00
    如果 2,你指的容器是 Docker,那我真的无语了。Docker 部署一个基本的原则就使用 Immutable Image 。
    ETiV
        19
    ETiV  
       2020-07-10 13:34:36 +08:00 via iPhone
    3: 额外打一个 runtime 镜像
    CI 时 Dockerfile FROM busybox

    CD 时,用 initContainer 把代码 copy 进与 runtime 共享的 volume
    594duck
        20
    594duck  
       2020-07-10 13:38:07 +08:00
    2 的好处是私有配置可以在 CI/CD 上上传,与测试配置解耦。
    Aquariuslt
        21
    Aquariuslt  
       2020-07-10 13:40:19 +08:00
    1
    wiken
        22
    wiken  
       2020-07-10 14:23:17 +08:00
    1 吧
    tikazyq
        23
    tikazyq  
       2020-07-10 14:33:17 +08:00
    一般是 1

    如果是 2,可能是针对那种一个容器里跑多个轻量级应用的情况吧
    whileFalse
        24
    whileFalse  
       2020-07-10 15:29:50 +08:00
    @ETiV 哥们你的想法很正确,但看来你不知道 docker multi stage build 。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     3430 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 28ms UTC 00:13 PVG 08:13 LAX 16:13 JFK 19:13
    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