Docker:组合多个图像

Fri*_*izz 25 java mysql linux docker

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

像这样:

genericA --
            \
             ---> specificAB
            /
genericB --
Run Code Online (Sandbox Code Playgroud)

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

我想要一个带有Java MySQL 的图像.

Adr*_*uat 9

不,您只能从一个图像继承.

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

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


Aar*_*n V 9

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

以下是构建这个稍微复杂的示例的方法:

                                     --> genericA --
                                    /                \
      debian:jessie -->  customBase                   ---> specificAB
                                    \                /
                                      --> genericB --
Run Code Online (Sandbox Code Playgroud)

你会使用这个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
Run Code Online (Sandbox Code Playgroud)

安装docker-makeCLI工具(pip install dockermake)后,您可以specificAB通过运行来构建映像

docker-make specificAB
Run Code Online (Sandbox Code Playgroud)