当前位置: 首页 > 知识库问答 >
问题:

docker构建-避免添加仅在构建时需要的文件

许奇
2023-03-14

我正在尝试构建一个避免不必要的批量的docker映像,并且遇到了一个我认为应该很常见的问题,但是到目前为止我还没有找到一个直截了当的解决方案。(我正在Ubuntu18.04系统上构建docker,从ubuntu层的开始。)

我希望能够挂载一个卷来访问.deb文件,而不是copy文件,后者在运行容器时很容易做到,但在构建容器时显然不可能做到?

到目前为止,我想要构建的是docker,我将add文件,然后用挂载的卷运行它,这样我就可以从容器中访问它,而不copy,然后我dpkg-i,然后我做一个docker提交,从那个容器中创建一个映像。果不其然,我最终得到的图像比我的第一次尝试小了3GB,但这似乎是一个黑客,并使脚本构建变得更加复杂。

我在想一定有一个更合适的方法来实现这一点,但是到目前为止我的搜索还没有揭示出一个明显的答案。我是不是漏掉了什么?


共有1个答案

岳嘉良
2023-03-14

依赖docker commit实际上是一种黑客攻击:)因此一些参考文献(如本文)提到了它的使用是不可取的。

对于您提到的那种用例,我只看到一种可能的方法(复制一个一次性的.deb包,安装它并立即从映像层删除二进制文件):

您可以使构建映像的docker引擎、您希望安装的.deb远程可用,并将copy+run指令替换为单个指令,例如依赖于curl:

RUN curl -OL https://example.com/foo.deb && dpkg -i foo.deb && rm -f foo.deb

如果curl尚未安装,则可以预先运行通常的APT命令:

RUN apt-get update -y -q \
  && DEBIAN_FRONTEND=noninteractive apt-get install -y -q --no-install-recommends \
    ca-certificates \
    curl \
  && apt-get clean \
  && rm -rf /var/lib/apt/lists/*

也许还有另一种可能的解决方案(但我认为多阶段builds Docker特性在这里没有什么帮助,因为如果执行copy--from=build//,所有的Perm都将丢失)。

 类似资料:
  • 目前,我发现谷歌云构建发生在构建docker图像的时候(不像我想象的那样,它会构建我的图像,然后执行我的图像来完成所有的构建)。那是在这篇文章里 谷歌云构建的快速启动 我有一个Dockerfile现在很简单 我有一个单一的下载和提取下载任何工件(zip文件)从最后的单构建运行构建(只有修改的服务器被构建或依赖于上一个CI构建的变化的服务器被构建,就像下游库可能被更改)。第一行只是列出了我需要在一个

  • 我试图在我的MarshmallowAOSP构建中包含一个预构建的谷歌apk(没有。so文件),基于以下链接中的信息: > 在我的供应商/制造商/设备/专有/系统/应用程序中,我创建了一个名为“Testapk”的文件夹。 我在这个'testapk'文件夹中保存了两个文件,apk('testapk.apk')和一个Android.mk文件,其中包含以下说明: LOCAL_PATH:=$(调用my-di

  • 垃圾回收期在管理内存方面非常出色,它非常高效地移除不再使用的对象。但是无论你如何看待它,分配和销毁一个基于堆内存的对象花费处理器时间比分配和销毁不是基于堆内存的对象要多。在函数内创建大量的引用类型对象会引入严重的性能消耗问题。 所以不能让垃圾回收器超负荷工作。你可以借鉴一些简单的技巧最小化垃圾回收器的工作。所有的引用类型对象,即使是局部变量,都被分配存储在堆内存上。每个引用类型的局部变量在函数结束

  • 问题内容: 可以说我的模块结构如下 现在要给客户端发消息,我需要构建所有模块,因为我正在加载上述所有模块的罐子,以最终发动客户端 并且所有jar都组装在模块部署中。 我的问题是,例如,如果我更改了服务中的任何内容,那么从运行构建时是否有办法可以识别出它只能构建,因此可以构建并将其部署到deploy文件夹中? 问题答案: 如果您正在使用SVN和* nix,请从根模块

  • 问题内容: 我使用了官方的elasticsearch docker镜像,想知道在构建自定义索引时如何也可以包括在内,以便在启动容器时该索引已经存在。 我的尝试是将以下行添加到我的dockerfile中: 我收到以下错误: 我可以在构建过程中通过这样的API调用到达elasticsearch还是有完全不同的方法来实现这一点? 问题答案: 我有类似的问题。 我想创建一个预加载数据的docker容器(通

  • 我的Dockerfile有点像 每次构建新映像时,都必须重新安装依赖项,这在我的区域可能会非常慢。 我想到的一种缓存已安装的软件包的方法是用以下更新的图像覆盖我的基本图像: 所以下次我用这个Dockerfile构建时,我的/base已经安装了一些包。 但这种解决方案有两个问题: 并不总是可以覆盖基本映像 随着新图像的分层,基本图像变得越来越大 那么,我可以用什么更好的解决方案来解决这个问题呢? 关