V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
pppguest3962
V2EX  ›  Linux

在 docker 容器安装软件和 deb 离线包的一些问题?

  •  
  •   pppguest3962 · 2023-03-04 14:47:39 +08:00 · 1934 次点击
    这是一个创建于 416 天前的主题,其中的信息可能已经有所发展或是发生改变。

    因为反复调试 Dockfile+shell 操作封装镜像,在旧镜像基础之上,每次调试时的过程中,在容器里面需安装一些软件以及它们的依赖 deb

    • apt-get install 使用在线安装,速度慢,安装包过百兆
    • 想着把这些软件以及它们的依赖 deb ,打包成 tar.gz ,在 Dockerfile 里 COPY + RUN 一个 shell 去安装

    问题来了

    • apt-get install xxx 的软件,deb 包一般会保存在/var/cache/apt/archives 吧? 但在在容器里 /bin/bash 环境中,安装完软件,这个目录不会有 deb 包,那些下载的包去哪里了?
    • apt-get 的源,有啥工具,能把指定的的软件(比如说 vim 这个软件),把它以及依赖的 deb 包,全部下载到指定目录中? (尽管环境已经安装了 vim 来说,也能够做到的)
    15 条回复    2023-03-06 17:32:24 +08:00
    Cola98
        1
    Cola98  
       2023-03-04 14:54:04 +08:00   ❤️ 1
    deb 包不清楚,关于 apt-get install 这里,容器可以配置代理,在 dockerd 中可以配置:https://docs.docker.com/engine/reference/commandline/dockerd/ 不管是拉镜像还是 build 都会走你的代理,之前我也是 apt-get install 还有 python 的一些依赖,第二个方法没有试过,是通过 golang 配置的时候想到的,op 可以试试看,就是给 apt 换源,不知道可不可行?
    pppguest3962
        2
    pppguest3962  
    OP
       2023-03-04 15:06:11 +08:00
    @Cola98 嗯嗯,无需代理,不是连不上源,加代理也不管用,目前已经在使用国内 aliyun 的源了,奈何软件包太大,速度慢,影响了调试配置 Dockfile 。。。。
    aru
        3
    aru  
       2023-03-04 16:17:36 +08:00   ❤️ 1
    本地用 nginx 做一个带缓存的反向代理,然后将源配置到这个反向代理
    pppguest3962
        4
    pppguest3962  
    OP
       2023-03-04 16:26:40 +08:00
    @aru 谢谢,方式不适合。
    seers
        5
    seers  
       2023-03-04 17:28:30 +08:00 via iPhone   ❤️ 1
    你需要修改你的 dockerfile 了,如果你正确编写的话 apt 是有缓存层的,不用每次去源拉
    SKYNE
        6
    SKYNE  
       2023-03-04 17:39:19 +08:00   ❤️ 1
    分成两个镜像,基础镜像中安装所需工具,再构建时使用基础镜像
    eastpiger
        7
    eastpiger  
       2023-03-04 17:46:55 +08:00
    我们日常实践中会先搞一个 base image ,包里 apt 装好必要的软件,可以用 dockerfile 生成这个 base image.
    然后后面的操作都基于这个 base image 开新的容器处理
    yaoyao1128
        8
    yaoyao1128  
       2023-03-04 17:59:06 +08:00 via iPhone   ❤️ 1
    apt download 可以保存到当前文件夹,如果想要包括依赖可以看 https://stackoverflow.com/questions/22008193/how-to-list-download-the-recursive-dependencies-of-a-debian-package 回答的适用代码是

    apt-get download $(apt-cache depends --recurse --no-recommends --no-suggests --no-conflicts --no-breaks --no-replaces --no-enhances <your-package-here> | grep "^\w" | sort -u)
    yaoyao1128
        9
    yaoyao1128  
       2023-03-04 18:04:21 +08:00 via iPhone   ❤️ 1
    如果说常用的话,个人建议维护一个本地仓库。apt-cacher 可以做到类似 nginx 但是更适合 apt ,每次请求可以作为 proxy 访问。
    不过印象中国内在 dockerfile 里面替换成国内源的话很少会出现下载不出来的情况……
    piku
        10
    piku  
       2023-03-04 18:40:06 +08:00 via Android   ❤️ 1
    容器内一般是--no-cache ,安装后不会保留 deb 包。
    那么问题来了,为什么不将依赖包安装完的容器打包为基础镜像。最终发布的 Dockerfile 也可以是分步镜像
    CnpPt
        11
    CnpPt  
       2023-03-04 20:28:32 +08:00   ❤️ 1
    解答第一个问题,apt install -d 是会下载到指定路径的。
    然后就按照你想实现的打包成 tar.gz 离线安装 deb 就行
    CnpPt
        12
    CnpPt  
       2023-03-04 20:36:37 +08:00   ❤️ 2
    给楼主表演个例子吧

    FROM ubuntu:20.04 as deb_focal

    RUN apt update && \
    apt install -d -y \
    vim && \
    cd /var/cache/apt/archives && \
    tar zcvf /tmp/basic_focal.tar.gz *.deb

    FROM ubuntu:20.04

    COPY --from=deb_focal /tmp/*.tar.gz /packages/

    RUN cd /packages && tar zxf basic_focal.tar.gz && dpkg -i *.deb

    CMD [ "sleep", "360000000" ]
    iseki
        13
    iseki  
       2023-03-04 20:41:39 +08:00   ❤️ 1
    @CnpPt tmp 目录里的东西会不会被弄进镜像
    julyclyde
        14
    julyclyde  
       2023-03-06 09:37:43 +08:00
    先执行 apt
    后面的步骤应该会用到前面 apt 之后的缓存结果,并不会重复 apt 啊
    libook
        15
    libook  
       2023-03-06 17:32:24 +08:00
    按照改动频率来分 layer ,比如一些基本不会改动的软件包安装过程写在靠前的位置,占用一个 RUN 指令,产生一个 layer ,你在改动后面安装的软件包的时候,只要前面不不变,就会复用已经生成的 layer ,不会重复执行安装。同时部署的时候只要底层的 layer 不变,就可以增量部署。

    优化多台机器的效率,可以使用离你近的软件包 mirror ,或者自建 mirror 。

    优化镜像大小可以把包管理器的缓存放到 tmpfs ,或者在一个 RUN 指令里安装完之后清除包管理器缓存。同理,也可以在同一个 RUN 指令内卸载运行时不用的软件包、删除不用的文件,如手册文件和 i18n 文件。要注意必须产生文件和删除文件必须在一个 RUN 指令内,否则会因产生新的 layer 导致瘦身无效。

    可以看看 docker squash ,是不是可以用上。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3286 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 12:39 · PVG 20:39 · LAX 05:39 · JFK 08:39
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.