多个FROM – 意味着什么

我想为github上的Linkurious项目构build一个docker镜像 ,它需要运行Neo4j数据库和Node.js。

我的第一个方法是为我的图像声明一个基本的图像,包含Neo4j。 参考文档没有以任何有用的方式定义“基本图像”:

基本图像:没有父项的图像是基本图像

从中我读到,如果图像本身没有基本图像,我可能只有一个基本图像。

但是什么是基础图像? 这是否意味着如果我在一个FROM指令中声明了neo4j / neo4j,那么当我的映像运行时,neo数据库将自动运行并在端口7474上的容器中可用?

阅读Docker参考(请参阅: https : //docs.docker.com/reference/builder/#from )我看到:

FROM可以在单个Dockerfile中出现多次,以创build多个图像。 只需在每个新的FROM命令之前logging由提交输出的最后一个映像ID。

我想创build多个图像? 它似乎是我想要的是有一个单一的图像,其中包含其他图像的内容,如neo4j和node.js

我没有发现任何指令来声明参考手册中的依赖关系。 有没有像在RPM中的依赖项为了运行我的形象调用上下文必须首先安装所需的图像?

我很困惑…

什么是基础图像?

一组文件,加上EXPOSE的d端口, ENTRYPOINTCMD
您可以添加文件并基于该基本映像构build一个新的映像,并以FROM指令开始一个新的Dockerfile :在FROM之后提到的映像是新映像的“基本映像”。

这是否意味着如果我在一个FROM指令中声明neo4j/neo4j ,那么当我的映像运行时,neo数据库将自动运行,并在端口7474上的容器中可用?

只有当你不覆盖CMDENTRYPOINT
但是图像本身就足够了:如果您必须添加与neo4j相关的文件以用于neo4j的特定用法,您将使用FROM neo4j/neo4j neo4j

FROM可以在单个Dockerfile中多次出现

:无论如何都有build议要删除这个“特征”( 问题13026 )

问题14412提到:

使用多个FROM不是一个真正的function,而是一个错误(噢,这个限制是严格的,在Dockerfile中有多个FROM用例)。


更新2017年5月(18个月后), docker(moby)17.05-ce 。

多个FROM 可以在一个Dockerfile中使用。
请参阅“ 构build器模式与Docker中的多阶段构build ”(由Alex Ellis 撰写 )和TõnisTiigi撰写的 PR 31257

之前:

构build器模式涉及到使用两个Docker镜像 – 一个用于执行构build,另一个用于提供第一个构build的结果,而不会影响第一个镜像中的构build链和工具。

后:

一般的语法是在你的Dockerfile中增加FROM次数 – 最后一个FROM语句是最终的基础镜像。 要从中间图像复制工件和输出,请使用COPY --from=<base_image_number>

例:

 FROM golang:1.7.3 as builder WORKDIR /go/src/github.com/alexellis/href-counter/ RUN go get -d -v golang.org/x/net/html COPY app.go . RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o app . FROM alpine:latest RUN apk --no-cache add ca-certificates WORKDIR /root/ COPY --from=builder /go/src/github.com/alexellis/href-counter/app . CMD ["./app"] 

结果将是两个图像,一个用于构build,一个只有最终的应用程序( 非常小得多)

 REPOSITORY TAG IMAGE ID CREATED SIZE multi latest bcbbf69a9b59 6 minutes ago 10.3MB golang 1.7.3 ef15416724f6 4 months ago 672MB