多个FROMs - 它的意思是什么

8 浏览
0 Comments

多个FROMs - 它的意思是什么

我想构建一个Docker镜像,这个镜像需要同时运行Neo4j数据库和Node.js。\n我的第一个尝试是为我的镜像声明一个基础镜像,其中包含Neo4j。参考文档没有以任何有用的方式定义“基础镜像”:\n

\n基础镜像:\n没有父镜像的镜像是基础镜像\n

\n从中我读到,只有当这个镜像本身没有基础镜像时,我才能有一个基础镜像。\n但是什么是基础镜像?这是否意味着,如果我在FROM指令中声明neo4j/neo4j,那么当我的镜像运行时,neo数据库会自动运行,并在容器的7474端口可用?\n阅读Docker参考,我看到:\n

\nFROM指令可以在一个Dockerfile中多次出现,以便创建多个镜像。只需在每个新的FROM指令之前记录提交的最后一个镜像ID。\n

\n我想创建多个镜像吗?看起来我想要的是一个包含其他镜像内容(如neo4j和node.js)的单个镜像。\n我在参考手册中没有找到声明依赖关系的指令。是否没有像RPM中那样的依赖关系,即调用上下文必须先安装所需的镜像才能运行我的镜像?

0
0 Comments

多个FROM语句 - 它的含义是什么?

在Docker中,使用多个FROM语句是为了实现多阶段构建(multi-stage builds)的功能。这个功能的基本思想是:

- 通过强制你列出你需要的内容,使你免于手动删除不需要的内容;

- 通过Docker的实现,释放会被占用的资源。

首先让我们从第一个目的开始讲解。很多时候在使用Debian等操作系统时,会出现以下的命令:

RUN apt-get update \

&& apt-get dist-upgrade \

&& apt-get install \

&& apt-get clean

我们可以通过上述命令来解释上面的语句。上面的命令是连在一起的,因此它代表了一次单一的变化,不需要额外的中间镜像。如果它被写成这样:

RUN apt-get update ;

RUN apt-get dist-upgrade;

RUN apt-get install ;

RUN apt-get clean;

这将会产生3个临时的中间镜像。将它减少到一个镜像后,还剩下一个问题:apt-get clean不会清除安装过程中使用的文件。如果Debian的维护者在他的安装中包含了修改系统的脚本,那么这个修改也会出现在最终的解决方案中(例如,pepperflashplugin-nonfree)。

通过使用多阶段构建,你可以获得所有单一变化操作的好处,但是需要你手动允许列表并复制在临时镜像中引入的文件,使用COPY --from语法来实现。此外,它是一个很好的解决方案,没有其他选择(例如apt-get clean),否则你的最终镜像中会有很多不需要的文件。

总结一下,FROM主要是一个命名空间声明。这里的限定符更像是扩展而不是继承。你可以声明多个命名空间,并且每个命名空间可以扩展另一个命名空间。如果其他答案适用于你,那么请坚持使用它。

你不是通过FROM从第一个镜像中继承,而是通过选择性地从你选择的镜像中复制目录来构建。我不知道如何找到每行的镜像ID,但这应该可以在网上找到。无论如何,多阶段构建的链接与第一个答案是相同的。

0
0 Comments

多个FROM语句的出现是因为Docker不支持将多个镜像合并成一个镜像的功能。如果在Dockerfile中使用多个FROM语句,最终会生成四个镜像,其中三个是从镜像仓库中拉取的水果图片,另一个是基于最后一个FROM语句构建的新镜像。

Docker不支持镜像合并的原因是为了避免合并过程中出现各种不同的操作系统、文件系统、库和应用程序的兼容性问题。Docker鼓励开发者采用微服务的架构模式,通过运行多个容器,并在需要时进行通信来实现功能的拆分。

如果想要合并不同的Linux发行版和所需的应用程序,可以通过以自己选择的发行版为基础镜像,并使用包管理器来安装应用程序的方式来实现。但是,这种方法可能会遇到没有适配所选发行版的软件包、所需版本不符合要求或者在Docker容器中无法正常工作的情况。在这种情况下,唯一的选择是手动安装所需的应用程序,或者在基础镜像上逐步添加所需的组件。

此外,Docker还提供了使用多个FROM语句并手动复制文件的选项,以实现镜像的合并。可以通过在FROM指令中添加"AS name"来为新的构建阶段命名,并在后续的FROM和COPY --from=指令中引用该阶段的镜像。这种方法需要开发者具备一定的经验和技巧,并且只适用于自己创建的镜像或者根据应用程序提供的文档进行操作。

总结一下,Docker不支持直接合并多个镜像,开发者可以采用微服务架构进行功能拆分,或者手动安装所需的应用程序,或者使用多个FROM语句并手动复制文件来实现镜像的合并。

0
0 Comments

多个FROM语句可以在一个Dockerfile中使用,这是从2017年5月开始的。可以在Dockerfile中添加多个FROM语句,最后一个FROM语句所指定的镜像将作为最终的基础镜像。要从中间镜像中复制文件和输出,可以使用COPY --from=命令。

在给定的例子中,首先使用golang:1.7.3作为构建镜像的基础镜像,然后在其中进行一系列操作。然后使用alpine:latest作为最终镜像的基础镜像,并在其中进行一些操作。最后,使用COPY --from=builder命令将构建镜像中的文件复制到最终镜像中。这样就会生成两个镜像,一个用于构建,另一个只包含最终的应用程序。

在上面的问答中,还有关于基础镜像的问题。基础镜像是一个文件集合,还包括一些EXPOSE'd端口、ENTRYPOINT和CMD等指令。可以基于基础镜像添加文件并构建一个新的镜像,新镜像的Dockerfile以FROM指令开始,FROM指令后面的镜像就是新镜像的基础镜像。

对于最后一个问题,只有在不覆盖CMD和ENTRYPOINT的情况下,才会自动运行neo4j数据库并在容器中的7474端口上可用。但是基础镜像本身就足够使用,如果需要为特定的neo4j使用情况添加文件,可以使用FROM neo4j/neo4j命令。

最后还有一个关于多个FROM语句的问题,即在一个Dockerfile中使用多个FROM语句时,为什么会跳过第一个FROM语句而只执行第二个FROM语句。对于这个问题,建议提供一个单独的问题,包括一个示例和您使用的Docker和操作系统的版本。

0