Docker:合并多个镜像

2022-09-01 12:16:54

使用 Docker 是否可以将两个映像合并为一个映像?

像这里这样:

genericA --
            \
             ---> specificAB
            /
genericB --

例如,有一个用于Java的映像和一个用于MySQL的映像。

我想有一个JavaMySQL的图像。


答案 1

不可以,您只能从一个映像继承。

您可能不希望Java和MySQL在同一映像中,因为在容器中具有单个组件(即创建一个单独的MySQL容器并将其链接到Java容器而不是将两者放入同一容器中)更为惯用。

但是,如果您确实必须将它们放在同一映像中,请编写一个以Java作为基本映像的Dockerfile(FROM语句),并在Dockerfile中安装MySQL。您应该能够从官方MySQL Dockerfile中大量复制语句。


答案 2

Docker不直接支持这一点,但你可以使用DockerMake(完全披露:我写的)来管理这种“继承”。它使用 YAML 文件来设置映像的各个部分,然后通过生成相应的 Dockerfile 来驱动生成。

下面介绍了如何构建这个稍微复杂一些的示例:

                                     --> genericA --
                                    /                \
      debian:jessie -->  customBase                   ---> specificAB
                                    \                /
                                      --> genericB --

您将使用此文件:DockerMake.yml

specificAB:
  requires:
    - genericA
    - genericB

genericA:
  requires:
     - customBase
  build_directory: [some local directory]
  build: |
    #Dockerfile commands go here, such as
    ADD installA.sh
    RUN ./installA.sh

genericB:
  requires:
    - customBase
  build: |
    #Here are some other commands you could run
    RUN apt-get install -y genericB
    ENV PATH=$PATH:something

customBase:
  FROM: debian:jessie
  build: |
    RUN apt-get update && apt-get install -y buildessentials

安装 CLI 工具 () 后,只需运行以下命令即可生成映像docker-makepip install dockermakespecificAB

docker-make specificAB

推荐