Java Docker:合并多个图像

Java Docker:合并多个图像,java,mysql,linux,docker,Java,Mysql,Linux,Docker,Docker是否可以将两个图像合并为一个 像这样: genericA -- \ ---> specificAB / genericB -- 例如,Java有一个映像,MySQL有一个映像 我想要一个带有Java和MySQL的映像。不,您只能从一个映像继承 您可能不希望Java和MySQL在同一个映像中,因为在一个容器中有一个组件更为惯用,即创建一个单独的MySQL容器并将其链接到Java容器,而不是将两者放在同一个

Docker是否可以将两个图像合并为一个

像这样:

genericA --
            \
             ---> specificAB
            /
genericB --
例如,Java有一个映像,MySQL有一个映像


我想要一个带有JavaMySQL的映像。

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

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


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

如果您执行
docker提交
,查看用于构建容器的命令并不方便,您必须发出
docker历史图像

如果你有一个Dockerfile,只要看看它,你就会知道它是如何构建的,它包含了什么


Docker commit是“手工”提交的,因此容易出错,
Docker build
使用工作正常的Docker文件要好得多。

您可以将来自的多个
命令放在一个Docker文件中


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

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

                                     --> genericA --
                                    /                \
      debian:jessie -->  customBase                   ---> specificAB
                                    \                /
                                      --> genericB --
您将使用此
DockerMake.yml
文件:

specificAB:
要求:
-通用
-一般的
通用:
要求:
-海关基地
生成目录:[某些本地目录]
建造:|
#Dockerfile命令位于此处,例如
添加installA.sh
运行/installash
一般B:
要求:
-海关基地
建造:|
#下面是一些您可以运行的其他命令
运行apt get install-y genericB
ENV PATH=$PATH:something
客户群:
发件人:debian:jessie
建造:|
运行apt-get-update&&apt-get-install-y buildessentials
安装
docker make
CLI工具(
pip install dockermake
)后,只需运行

docker make specificAB

感谢您的回复。由于我是Docker的新手(我在3小时前安装了它;-),接下来的一个问题是:为什么我需要DockerFile?我能不能创建一个Java容器的快照(?),不知道它在“Docker术语”中是如何调用的,然后在其中手动安装MySQL(使用apt get等工具)?您可以使用“Docker提交”来实现这一点。问题是它是不可重复的,所以如果你想改变一些东西,你必须从头开始。DockerFile绝对是一个好办法。Java和mysql应该在单独的Docker中,这是一个很好的观点,但情况并非总是如此,问题仍然存在,例如,我可能想安装nginx+python,两者都有两个映像。您的解决方案只是菱形继承模式的一种变通方法。“FROM可以在单个Dockerfile中多次出现,以便创建多个图像。”-来自您的链接。因此,它不会组合图像,而是创建多个图像