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

2023-03-04 14:47:39 +08:00
 pppguest3962

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

问题来了

1950 次点击
所在节点    Linux
15 条回复
Cola98
2023-03-04 14:54:04 +08:00
deb 包不清楚,关于 apt-get install 这里,容器可以配置代理,在 dockerd 中可以配置:https://docs.docker.com/engine/reference/commandline/dockerd/ 不管是拉镜像还是 build 都会走你的代理,之前我也是 apt-get install 还有 python 的一些依赖,第二个方法没有试过,是通过 golang 配置的时候想到的,op 可以试试看,就是给 apt 换源,不知道可不可行?
pppguest3962
2023-03-04 15:06:11 +08:00
@Cola98 嗯嗯,无需代理,不是连不上源,加代理也不管用,目前已经在使用国内 aliyun 的源了,奈何软件包太大,速度慢,影响了调试配置 Dockfile 。。。。
aru
2023-03-04 16:17:36 +08:00
本地用 nginx 做一个带缓存的反向代理,然后将源配置到这个反向代理
pppguest3962
2023-03-04 16:26:40 +08:00
@aru 谢谢,方式不适合。
seers
2023-03-04 17:28:30 +08:00
你需要修改你的 dockerfile 了,如果你正确编写的话 apt 是有缓存层的,不用每次去源拉
SKYNE
2023-03-04 17:39:19 +08:00
分成两个镜像,基础镜像中安装所需工具,再构建时使用基础镜像
eastpiger
2023-03-04 17:46:55 +08:00
我们日常实践中会先搞一个 base image ,包里 apt 装好必要的软件,可以用 dockerfile 生成这个 base image.
然后后面的操作都基于这个 base image 开新的容器处理
yaoyao1128
2023-03-04 17:59:06 +08:00
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
2023-03-04 18:04:21 +08:00
如果说常用的话,个人建议维护一个本地仓库。apt-cacher 可以做到类似 nginx 但是更适合 apt ,每次请求可以作为 proxy 访问。
不过印象中国内在 dockerfile 里面替换成国内源的话很少会出现下载不出来的情况……
piku
2023-03-04 18:40:06 +08:00
容器内一般是--no-cache ,安装后不会保留 deb 包。
那么问题来了,为什么不将依赖包安装完的容器打包为基础镜像。最终发布的 Dockerfile 也可以是分步镜像
CnpPt
2023-03-04 20:28:32 +08:00
解答第一个问题,apt install -d 是会下载到指定路径的。
然后就按照你想实现的打包成 tar.gz 离线安装 deb 就行
CnpPt
2023-03-04 20:36:37 +08:00
给楼主表演个例子吧

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

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

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

可以看看 docker squash ,是不是可以用上。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/921082

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX