多个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端口, ENTRYPOINT
和CMD
。
您可以添加文件并基于该基本映像构build一个新的映像,并以FROM
指令开始一个新的Dockerfile
:在FROM
之后提到的映像是新映像的“基本映像”。
这是否意味着如果我在一个
FROM
指令中声明neo4j/neo4j
,那么当我的映像运行时,neo数据库将自动运行,并在端口7474上的容器中可用?
只有当你不覆盖CMD
和ENTRYPOINT
。
但是图像本身就足够了:如果您必须添加与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