在 docker 容器安装软件和 deb 离线包的一些问题? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
pppguest3962
V2EX    Linux

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

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

    因为反复调试 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 开新的容器处理
    yaoyaomoe
        8
    yaoyaomoe  
       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)
    yaoyaomoe
        9
    yaoyaomoe  
       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  
    /div>   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     Solana     3041 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 26ms UTC 12:00 PVG 20:00 LAX 05:00 JFK 08:00
    Do have faith in what you're doing.
    ubao 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