因为反复调试 Dockfile+shell 操作封装镜像,在旧镜像基础之上,每次调试时的过程中,在容器里面需安装一些软件以及它们的依赖 deb
问题来了
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 换源,不知道可不可行?
|
2
pppguest3962 OP @Cola98 嗯嗯,无需代理,不是连不上源,加代理也不管用,目前已经在使用国内 aliyun 的源了,奈何软件包太大,速度慢,影响了调试配置 Dockfile 。。。。
|
3
aru 2023-03-04 16:17:36 +08:00 1
本地用 nginx 做一个带缓存的反向代理,然后将源配置到这个反向代理
|
4
pppguest3962 OP @aru 谢谢,方式不适合。
|
5
seers 2023-03-04 17:28:30 +08:00 via iPhone 1
你需要修改你的 dockerfile 了,如果你正确编写的话 apt 是有缓存层的,不用每次去源拉
|
6
SKYNE 2023-03-04 17:39:19 +08:00 1
分成两个镜像,基础镜像中安装所需工具,再构建时使用基础镜像
|
7
eastpiger 2023-03-04 17:46:55 +08:00
我们日常实践中会先搞一个 base image ,包里 apt 装好必要的软件,可以用 dockerfile 生成这个 base image.
然后后面的操作都基于这个 base image 开新的容器处理 |
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) |
9
yaoyao1128 2023-03-04 18:04:21 +08:00 via iPhone 1
如果说常用的话,个人建议维护一个本地仓库。apt-cacher 可以做到类似 nginx 但是更适合 apt ,每次请求可以作为 proxy 访问。
不过印象中国内在 dockerfile 里面替换成国内源的话很少会出现下载不出来的情况…… |
10
piku 2023-03-04 18:40:06 +08:00 via Android 1
容器内一般是--no-cache ,安装后不会保留 deb 包。
那么问题来了,为什么不将依赖包安装完的容器打包为基础镜像。最终发布的 Dockerfile 也可以是分步镜像 |
11
CnpPt 2023-03-04 20:28:32 +08:00 1
解答第一个问题,apt install -d 是会下载到指定路径的。
然后就按照你想实现的打包成 tar.gz 离线安装 deb 就行 |
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" ] |
14
julyclyde 2023-03-06 09:37:43 +08:00
先执行 apt
后面的步骤应该会用到前面 apt 之后的缓存结果,并不会重复 apt 啊 |
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 ,是不是可以用上。 |