将docker图像与公共基合并

将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映像,称之为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的层是通过从源代码处编译包来创建的(这需要很长时间),在上面的方案中,C为每个版本编译两次(一次在a+B1上,一次在a+B2上)。但是,由于C不依赖于B,为每个版本的B编译它是浪费时间的,所以我想做以下几点:

  • 从A开始,为每个软件包版本创建一个映像,例如A+B1、A+B2、A+C1、A+C2
  • 合并图像以创建多包图像,例如(A+B1)+(A+C1)=A+B1+C1
  • 每个包只编译一次,然后每个包图像与另一个包图像组合,通过在公共基础图像(A)的顶部堆叠两个独立层(例如B2和C1)形成最终图像


    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
    命令序列。

    谢谢,我也是按照同样的思路进行推理的。就构建机器上的磁盘使用而言,该解决方案仍然是次优的,因为复制的文件将分为两层。但我想这是最好的了。谢谢你,我也是这么想的。就构建机器上的磁盘使用而言,该解决方案仍然是次优的,因为复制的文件将分为两层。但我想这是最好的了。