V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
aljun
V2EX  ›  程序员

现在大家公司 Build 镜像都喜欢用什么? Podman? Docker? BuildKit? buildpacks?

  •  2
     
  •   aljun · 2023-05-29 18:51:00 +08:00 · 6825 次点击
    这是一个创建于 568 天前的主题,其中的信息可能已经有所发展或是发生改变。

    想问问大家目前公司都用什么来 build 镜像?因为目前走的 docker ,感觉各种难用,还得 dind ,而且还有 rootless 的问题

    • podman
    • docker
    • BuildKit (只是 buildkit ,非 docker )
    • buildpack
    • Buildah
    • 还有其他的话欢迎补充
    65 条回复    2023-06-05 10:47:06 +08:00
    zengxs
        1
    zengxs  
       2023-05-29 18:56:16 +08:00
    前面两个选 docker, 兼容性比 podman 好,后面 3 个没用过
    crazyweeds
        2
    crazyweeds  
       2023-05-29 18:57:36 +08:00
    公司级别的,最终还是 dockerfile 。
    zengxs
        3
    zengxs  
       2023-05-29 18:58:49 +08:00
    建议你们单独拿个系统来跑 build, 这样不用考虑 dind 和 rootless 问题,并且根据我的经验 rootless 构建出来的某些镜像可能会有问题
    littlezzll
        4
    littlezzll  
       2023-05-29 19:11:58 +08:00 via Android
    加一个 kaniko
    Nitroethane
        5
    Nitroethane  
       2023-05-29 19:20:34 +08:00
    dind 是什么,是已经 archived 的那个「 Docker in Docker 」的项目吗?为啥要用这个呀?
    哪里解决的 Docker 难用,可以举个例子吗
    Nitroethane
        6
    Nitroethane  
       2023-05-29 19:20:45 +08:00
    @zengxs 大概会有什么问题啊
    sobev
        7
    sobev  
       2023-05-29 19:24:55 +08:00
    Buildah
    zengxs
        8
    zengxs  
       2023-05-29 19:29:40 +08:00
    @Nitroethane #6
    表现出来的现象就是用 rootless 某些 dockerfile 构建出来的镜像用不了,运行报错 exec format error ,
    同样的 dockerfile 项目,不用 rootless 就没这个问题,具体是什么原因导致的我也没搞清楚
    aljun
        9
    aljun  
    OP
       2023-05-29 20:04:52 +08:00
    @zengxs rootless 的容器也难用
    aljun
        10
    aljun  
    OP
       2023-05-29 20:05:07 +08:00
    @littlezzll 嗯嗯,但这个怎么样呢? G 家的好不好呀?
    aljun
        11
    aljun  
    OP
       2023-05-29 20:05:31 +08:00
    @Nitroethane 因为实在容器里面 build 呀,就是自动化流程走 pipeline ,非本地
    aljun
        12
    aljun  
    OP
       2023-05-29 20:06:08 +08:00
    @zengxs 这个不该是 x86/ arm 之类的问题?你加个 platform 的 option 试试?
    aljun
        13
    aljun  
    OP
       2023-05-29 20:06:22 +08:00
    @sobev 这个好用吗?和 docker 比呢?
    hljjhb
        14
    hljjhb  
       2023-05-29 20:30:59 +08:00
    kaniko

    没什么大问题
    aljun
        15
    aljun  
    OP
       2023-05-29 21:51:24 +08:00
    @hljjhb 和其他的比较好在哪里呢?
    zhenjiachen
        16
    zhenjiachen  
       2023-05-29 22:25:23 +08:00 via iPhone   ❤️ 1
    如果是 spring boot 我们使用 jib
    Bromine0x23
        17
    Bromine0x23  
       2023-05-29 22:31:19 +08:00
    kaniko
    superchijinpeng
        18
    superchijinpeng  
       2023-05-29 22:48:05 +08:00 via iPhone
    mac 上 colima
    linux 上 nerdctl
    windows 上 docker desktop
    perfectlife
        19
    perfectlife  
       2023-05-29 23:23:25 +08:00 via Android
    能选择我还是喜欢用 docker ,但是现在被迫用 kaniko 和 buildkit 在 containerd 上进行构建
    huihuimoe
        20
    huihuimoe  
       2023-05-29 23:59:59 +08:00 via iPhone
    用 kaniko ,不需要考虑 dind/rootless 环境问题
    hljjhb
        21
    hljjhb  
       2023-05-30 00:19:26 +08:00
    @aljun #15 只是为了 rootless ,构建会慢些,然后不支持交叉编译
    abc612008
        22
    abc612008  
       2023-05-30 00:31:26 +08:00
    bazel
    Reficul
        23
    Reficul  
       2023-05-30 01:21:29 +08:00
    bazel + rules_docker
    yianing
        24
    yianing  
       2023-05-30 02:33:00 +08:00 via Android
    buildkit 就是 docker buildx 吧,可以一下编译多个平台的很方便
    clgon
        25
    clgon  
       2023-05-30 08:26:43 +08:00
    kaniko
    ExplodingFKL
        26
    ExplodingFKL  
       2023-05-30 08:29:09 +08:00
    kaniko

    不需要特权( SYS_ADM,fuse,overlay )就能跑,甚至能在 rootless 下工作,
    mengdodo
        27
    mengdodo  
       2023-05-30 08:57:56 +08:00
    一直都是默认的 docker ,你们更新的太快了,我快跟不上了
    chaleaochexist
        28
    chaleaochexist  
       2023-05-30 09:15:41 +08:00
    我们还在用 docker 且运行时也是 docker.
    loveuer
        29
    loveuer  
       2023-05-30 09:22:23 +08:00
    kaniko 还可以
    从 docker build 切换到 kaniko 没啥痛点
    kassadin
        30
    kassadin  
       2023-05-30 09:38:49 +08:00
    就 docker 啊,这是已经发展到哪了,我先收藏一下
    BQsummer
        31
    BQsummer  
       2023-05-30 10:27:10 +08:00
    kaniko. jebkins slave 在 eci 上弹扩, kaniko 不需要 docker daemon
    julyclyde
        32
    julyclyde  
       2023-05-30 10:42:48 +08:00
    @zengxs 啥叫兼容性?
    julyclyde
        33
    julyclyde  
       2023-05-30 10:43:58 +08:00
    @Nitroethane 有些邪教徒喜欢“everything in docker”,甚至连 docker build 过程也放在 docker 内运行
    所以有了 docker in docker 项目。确实解决了一些基础问题,但这需求本身其实是没啥用的
    DefoliationM
        34
    DefoliationM  
       2023-05-30 11:01:17 +08:00
    podman ,rootless 太爽了
    zengxs
        35
    zengxs  
       2023-05-30 11:08:03 +08:00
    @aljun #12 不是 platform 的问题,我在构建的机器上也运行不了
    NaVient
        36
    NaVient  
       2023-05-30 11:09:59 +08:00
    buildkit


    kaniko 的痛点是慢,真的太慢了
    aljun
        37
    aljun  
    OP
       2023-05-30 13:11:04 +08:00
    @Bromine0x23 有什么优势呢?
    aljun
        38
    aljun  
    OP
       2023-05-30 13:11:20 +08:00
    @superchijinpeng 是在 docker 内跑呢,就是容器内 build
    aljun
        39
    aljun  
    OP
       2023-05-30 13:11:47 +08:00
    @perfectlife 为什么时被迫呢?我也是在 containerd 里,有什么区别?
    aljun
        40
    aljun  
    OP
       2023-05-30 13:12:01 +08:00
    @huihuimoe 那会不会有权限问题?
    aljun
        41
    aljun  
    OP
       2023-05-30 13:12:28 +08:00
    @abc612008 这个好像不是编译镜像的吧。。。
    aljun
        42
    aljun  
    OP
       2023-05-30 13:12:48 +08:00
    @Reficul bazel 好像不是编译镜像的吧,rules docker 是啥?
    aljun
        43
    aljun  
    OP
       2023-05-30 13:13:05 +08:00
    @yianing 是的,可以裸着用,但是日志貌似不是很方便
    aljun
        44
    aljun  
    OP
       2023-05-30 13:13:19 +08:00
    @clgon 有什么好处呢?
    aljun
        45
    aljun  
    OP
       2023-05-30 13:13:37 +08:00
    @ExplodingFKL 其他的有什么好处呢?
    aljun
        46
    aljun  
    OP
       2023-05-30 13:16:03 +08:00
    @loveuer 有什么好处不?
    perfectlife
        47
    perfectlife  
       2023-05-30 13:27:26 +08:00
    @aljun 我是在 k8s 上用 pod 去构建镜像的,运行时是 containerd 用不了挂载宿主机上 docker 的 unix socket 这种方式来,用 DinD 作为 Pod 的 Sidecar 或者使用 DaemonSet 在每个 containerd 节点上部署 Docker 这两种方式感觉都不太舒服
    aljun
        48
    aljun  
    OP
       2023-05-30 13:29:42 +08:00
    @BQsummer 现在都是 kaniko 吗?
    aljun
        49
    aljun  
    OP
       2023-05-30 13:30:12 +08:00
    @julyclyde 我是放在 containerd 里面 build ,所以需要 dind 的 image 去 run 这个
    aljun
        50
    aljun  
    OP
       2023-05-30 13:30:41 +08:00
    @DefoliationM 使用上方便吗?
    aljun
        51
    aljun  
    OP
       2023-05-30 13:31:00 +08:00
    @NaVient 感觉 buildkit 几乎就是 docker 呀
    aljun
        52
    aljun  
    OP
       2023-05-30 13:31:31 +08:00
    @perfectlife 我目前也差不多是这样,你有什么别的好的方案吗?
    fioncat
        53
    fioncat  
       2023-05-30 13:33:06 +08:00
    我们是在 k8s 里面构建镜像的,为了避免 dind ,用的 kaniko 。
    zhoudaiyu
        54
    zhoudaiyu  
       2023-05-30 13:34:47 +08:00
    现在用的是 docker BuildKit ,感觉还可以,就是 qemu 跨 arch 编译确实有些慢,不过这种一般都是需要编译 whl 时才涉及,还好
    ExplodingFKL
        55
    ExplodingFKL  
       2023-05-30 13:35:08 +08:00
    @aljun 各有优劣,我的需求是要能在 kubernetes 下编译镜像并且需要的权限越少越好,经过对比:

    - docker/buildkit/nerdctl(containerd) : (privileged)
    - podman/Buildah : (fuse) https://www.redhat.com/sysadmin/podman-inside-kubernetes
    - kaniko: UID=0

    所以就选了 kaniko
    perfectlife
        56
    perfectlife  
       2023-05-30 13:35:58 +08:00
    @aljun buildkit 使用 daemonless 可以在没有 docker 情况下构建,或者用 kaniko
    Reficul
        57
    Reficul  
       2023-05-30 22:07:57 +08:00
    @aljun #42

    https://github.com/bazelbuild/rules_docker
    bazel 是通用构建系统,有对应的构建规则就能构建对应的产物,没有对应的规则也可以自己编写相应的规则。

    docker 镜像本质是一堆 rootfs 的分层 tar 包外加一个 manifest 文件。所以只要构建出来的文件产物符合镜像规范,就能够推送到仓库里去,而要实现这个过程 docker 环境也不是必须的,直接 curl registry 的 API 就够了。 诸如 skopeo 这种镜像工具就是类似的做法。

    此外,所以如果你的程序(比如 Go 代码)支持交叉编译,交叉构建镜像也是自然支持的。因为 Dockerfile 里的 RUN 动作才是需要在当前机器的容器里跑,其他动作本质上都是在操作文件而已。
    cumt21g
        58
    cumt21g  
       2023-05-30 23:55:05 +08:00
    docker buildx
    cumt21g
        59
    cumt21g  
       2023-05-30 23:56:40 +08:00
    这么多用 kaniko 的,是没想到的
    ysc3839
        60
    ysc3839  
       2023-05-31 01:24:10 +08:00 via Android
    没啥特殊需求,docker buildx
    abc612008
        61
    abc612008  
       2023-05-31 08:09:12 +08:00
    hxndg
        62
    hxndg  
       2023-06-01 14:40:27 +08:00
    @Reficul @aljun
    bazel rules docker 的好处是确定性。但是目前 bazel 对内存的消耗和时间效率啥的还是不如 docker 好。。。。此外要有效处理缓存机制,避免 bazel 层面 cache layer 。

    这种如果不是整体做 bazel 的平台相关的话还是不推荐用

    如果整体用 bazel 体系做的话会比较爽
    Reficul
        63
    Reficul  
       2023-06-01 15:18:42 +08:00
    @hxndg #62

    bazel 层面 cache layer 是指的啥,按道理 layer tar 这层只会在有变化的时候发生变化,如果没有的话直接利用 bazel action 产物的缓存就够了。至于 bazel 的缓存,可以放对象存储里面,只需要启动一个 gateway 。

    不过的确没有 docker 易用,需要一个人愿意花时间在里面。整体框架搭好之后,还是很爽的。
    hxndg
        64
    hxndg  
       2023-06-01 15:32:30 +08:00
    @Reficul
    你们用的是 remote cache 还是 buildfarm 那一套?如果需要频繁的 integration test ,很多 bazel 的 layer 不用缓存的?
    我追求效率没使用 gateway cache ,用的还是 buildfarm 本地存储之类
    Reficul
        65
    Reficul  
       2023-06-05 10:47:06 +08:00
    @hxndg

    用的是 remote cache ,目前没感觉 layer 缓存有啥效率问题...
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5329 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 55ms · UTC 06:56 · PVG 14:56 · LAX 22:56 · JFK 01:56
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.