有没有办法将Docker镜像合并到一个容器中?

我现在有几个Dockerfiles。

一个是Cassandra 3.5, FROM cassandra:3.5

我也有Kafka的Dockerfile,但是t比较复杂。 它是FROM java:openjdk-8-fre ,它运行一个很长的命令来安装Kafka和Zookeeper。

最后,我有一个使用SBT编写的Scala应用程序。

对于那个Dockerfile,它是FROM broadinstitute/scala-baseimage ,它得到我的Java 8,斯卡拉2.11.7,STB 0.13.9,这是我所需要的。

也许,我不明白Docker是如何工作的,但是我的Scala程序拥有Cassandra和Kafka作为依赖关系,并且为了开发目的,我希望其他人能够简单地使用Dockerfile克隆我的repo,然后能够使用Cassandra来构build它,卡夫卡,斯卡拉,爪哇和SBT都烘烤,以便他们可以编译源。 虽然我有很多问题。

我如何组合这些Dockerfiles? 我如何简单地用这些东西烘烤的环境?

由于冲突可能发生,您不能组合dockerfiles。 你想要做的是创build一个新的dockerfile或build立一个自定义图像。

TL; DR; 如果你当前的开发容器包含了你所需要和工作的所有工具,那么把它保存为一个图像,并将其保存到一个仓库中,并创build一个dockerfile,从该仓库中取出该仓库。

详细信息:构build自定义图像比使用公共图像创builddockerfile要容易得多,因为您可以将任何黑客和mod存储到图像中。 为此,请使用基本Linux映像(或broadinstitute / scala-baseimage)启动一个空白容器,安装所需的任何工具并configuration它们直到所有工作正常,然后将其作为映像保存(容器)。 从这个图像创build一个新的容器,并testing,看看你是否可以通过docker构build(或者你想要/build立它)上的代码。 如果它有效,比你有一个工作基础的图像,你可以上传到回购,以便其他人可以把它。

要使用公共图像构builddockerfile,您需要将所有hack,mods和setup设置在dockerfile本身上。 也就是说,你将需要把你使用的每一个命令行放到一个文本文件中,并减less任何黑客,mods和设置到命令行。 最后,你的dockerfile会自动创build一个镜像,你不需要把这个镜像存储到一个仓库中,所有你需要做的就是给其他人一个dockerfile,他们可以在自己的docker上旋转镜像。

请注意,一旦你有一个工作的dockerfile,你可以轻松地调整它,因为它会创build一个新的图像,每次你使用dockerfile。 使用自定义图像时,可能会遇到由于冲突而需要重build图像的问题。 例如,所有的工具都可以在openjdk上运行,直到你安装了一个不起作用的工具。 修复可能涉及到卸载openjdk并使用oracle,但是您为所有已安装的工具所做的所有configuration都已损坏。

是的,你可以把大量的软件放到一个Docker镜像中( GitLab这样做,包括Postgres和其他所有镜像),但是常规是正确的 – 这不是使用Docker的典型方法。

正如你所说,Cassandra和Kafka是你的Scala应用程序的依赖项 ,它们不是应用程序的一部分,所以它们不属于同一个图像。

必须使用Docker Compose编排许多容器才能添加额外的pipe理层,但它为您提供了更多的灵活性:

  • 你的容器可以有不同的寿命,所以当你有一个新版本的应用程序要部署时,你只需要运行一个新的应用程序容器,你可以保持依赖运行;
  • 您可以在任何环境中使用相同的应用程序映像,使用不同的configuration来进行依赖关系 – 例如,在dev中,您可以运行一个基本的Kafka容器,并且在许多节点上聚集它,您的应用程序容器是相同的;
  • 您的依赖关系也可以被其他应用程序使用 – 所以多个消费者可以在不同的容器中运行,并且都使用相同的Kafka和Cassandra容器。
  • 加上所有的可扩展性,日志等已经提到。

Docker不会合并图片,但是没有任何东西可以阻止你结合dockerfiles(如果有的话),并将它们滚动到需要构build的胖图片中。 然而,有时候这是有道理的,因为在一个容器中运行多个进程,大多数Docker教条都指向这个不太理想的地方,尤其是在微服务体系结构中(但是规则是否有被打破的权利?)

您不能将docker图像合并到一个容器中。 请参阅Moby问题中的详细讨论, 如何通过Dockerfile将多个图像合并为一个 。

对于你的情况,最好不要包括整个卡桑德拉和卡夫卡的图像。 该应用程序只需要Cassandra Scala驱动程序和Kafka Scala驱动程序。 容器只能包含驱动程序。