将docker图像与公共基合并
我需要从一个公共基础映像开始生成几个docker映像,称之为a。在a之上,我必须为包B和C添加两个层,这两个包都有几个版本(B1、B2、C1、C2等)。这两个包是独立的,我需要生成包含所有可能版本组合的图像。我目前的做法很天真:将docker图像与公共基合并,docker,Docker,我需要从一个公共基础映像开始生成几个docker映像,称之为a。在a之上,我必须为包B和C添加两个层,这两个包都有几个版本(B1、B2、C1、C2等)。这两个包是独立的,我需要生成包含所有可能版本组合的图像。我目前的做法很天真: 从A开始,为B的每个版本创建一个映像:A+B1、A+B2 从A+B1开始,为C的每个版本创建一个映像:A+B1+C1、A+B1+C2 从A+B2开始,为C的每个版本创建一个映像:A+B2+C1、A+B2+C2 B和C的层是通过从源代码处编译包来创建的(这需要很长时间),
docker允许这样做吗?谢谢。原则上,你可以用一个简单的方法来完成这项工作。这将把整个序列合并到一个Dockerfile中。在某种程度上,这可能看起来像:
FROM A AS B
ARG B_VERSION
WORKDIR /build
RUN curl http://b.example.org/b-${B_VERSION}.tar.gz \
&& tar xzf b-${B_VERSION}.tar.gz \
&& mv b-${B_VERSION} b
WORKDIR /build/b
RUN ./configure --prefix=/opt/B ... && make install
FROM A AS C
ARG C_VERSION
... as above, installing into /opt/C ...
FROM A
COPY --from=B /opt/B /opt/B
COPY --from=C /opt/C /opt/C
这里的技巧是,每个FROM
行开始一个新的映像构建,因此Docker映像缓存可以在每个新的FROM
行重新开始。构建阶段不需要从同一个基本映像开始,尽管如果始终只使用基于Alpine或Debian的映像,这会有所帮助
如果您不想依赖Docker层缓存,可以将其拆分为单独的Docker文件。对于
FROM
和COPY--FROM=…
来说,您可以使用任何图像,甚至是您自己构建的图像。然而,Docker并没有为构建这样的分层图像提供任何形式的编排。您必须编写自己的shell脚本或Makefile来运行docker build
命令序列。原则上,您可以使用。这将把整个序列合并到一个Dockerfile中。在某种程度上,这可能看起来像:
FROM A AS B
ARG B_VERSION
WORKDIR /build
RUN curl http://b.example.org/b-${B_VERSION}.tar.gz \
&& tar xzf b-${B_VERSION}.tar.gz \
&& mv b-${B_VERSION} b
WORKDIR /build/b
RUN ./configure --prefix=/opt/B ... && make install
FROM A AS C
ARG C_VERSION
... as above, installing into /opt/C ...
FROM A
COPY --from=B /opt/B /opt/B
COPY --from=C /opt/C /opt/C
这里的技巧是,每个FROM
行开始一个新的映像构建,因此Docker映像缓存可以在每个新的FROM
行重新开始。构建阶段不需要从同一个基本映像开始,尽管如果始终只使用基于Alpine或Debian的映像,这会有所帮助
如果您不想依赖Docker层缓存,可以将其拆分为单独的Docker文件。对于
FROM
和COPY--FROM=…
来说,您可以使用任何图像,甚至是您自己构建的图像。然而,Docker并没有为构建这样的分层图像提供任何形式的编排。您必须编写自己的shell脚本或Makefile来运行docker build
命令序列。谢谢,我也是按照同样的思路进行推理的。就构建机器上的磁盘使用而言,该解决方案仍然是次优的,因为复制的文件将分为两层。但我想这是最好的了。谢谢你,我也是这么想的。就构建机器上的磁盘使用而言,该解决方案仍然是次优的,因为复制的文件将分为两层。但我想这是最好的了。