【发布时间】:2018-09-24 06:54:46
【问题描述】:
我正在努力将我当前的 dockerfile 转换为多阶段构建以减少一些麻烦。我从一个基础镜像开始,通过 yum 安装一堆东西以及我从源代码安装的一堆其他包。
此时,我想从一个全新的镜像开始,只引入通过 yum 安装的软件包和我从源代码安装的二进制文件。我看到了三种方法可以做到这一点,但我不喜欢第一个选项,也不知道如何做另外两个。
选项 1
为 yum 安装构建一个单独的 Dockerfile,然后在从源安装之前将其用作我的基本映像。
我不喜欢这个选项,因为它增加了我的构建工作流程。将所有内容都包含在一个 Dockerfile 中会很好。不过,也许这就是我需要走的路。
选项 2
通过 yum 在不同的目录中安装包并复制到构建的下一个阶段。
我发现我可以通过yum install --installroot=/foo --releasever=/ packagename 在非默认目录中安装软件包,但是,这会将所有要求安装到 /foo,而不是继续使用安装在 /usr 中的软件包,从而导致映像显着增长。
有没有办法通过 yum 在不同的目录中安装包,但它是否继续从默认目录解析其依赖关系?
选项 3
通过 yum 安装包,然后在 yum 包安装后开始下一个构建阶段。
有没有办法将构建阶段产生的层用作下一个构建阶段的开始?像这样的:
FROM centos7 as first
RUN some stuff
FROM first as second
RUN some stuff
FROM second
COPY --from=second ...
【问题讨论】:
-
嘿,你找到办法了吗?
-
其实,没有。我刚刚不得不处理变通方法......大多数情况下我只使用“选项 1”。
-
这样做有什么好处?如果您想优化构建时间,docket build 已经做到了,因为它只是构建与上次构建的差异。如果您不重用基础镜像,为什么不坚持使用单个 Dockerfile?
-
这与构建时间无关。这与图像大小有关。构建一些二进制文件会留下太多垃圾。
-
分享你当前的 dockerfile
标签: docker