Docker:组合多个图像

时间:2014-11-30 15:18:48

标签: java mysql linux docker

Docker是否可以将两个图像组合成一个?

像这样:

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

例如,有一个Java图像和一个MySQL图像。

我希望拥有一个带有Java MySQL的图像。

4 个答案:

答案 0 :(得分:9)

不,你只能从一张图片继承。

你可能不希望Java和MySQL在同一个图像中,因为在容器中有一个单独的组件更为惯用,即创建一个单独的MySQL容器并将其链接到Java容器,而不是将它们放入同一个容器中。

但是,如果你真的必须在同一个映像中使用它们,请编写一个以Java为基本映像(FROM语句)的Dockerfile,并在Dockerfile中安装MySQL。您应该可以在很大程度上复制官方MySQL Dockerfile中的语句。

答案 1 :(得分:9)

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

以下是如何构建这个稍微复杂的示例:

                                     --> 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

安装docker-make CLI工具(pip install dockermake)后,只需运行

即可构建specificAB图像
docker-make specificAB

答案 2 :(得分:1)

如果您执行docker commit,查看用于构建容器的命令并不方便,您必须发出docker history image

如果您有Dockerfile,只需查看它,您就会看到它是如何构建的以及它包含的内容。

Docker提交是手动'因此容易出错,docker build使用可行的Dockerfile要好得多。

答案 3 :(得分:-3)

您可以将多个clear: both;命令放在一个Dockerfile中。

https://docs.docker.com/reference/builder/#from