Docker是否可以将两个图像组合成一个?
像这样:
genericA --
\
---> specificAB
/
genericB --
例如,有一个Java图像和一个MySQL图像。
我希望拥有一个带有Java 和 MySQL的图像。
答案 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中。