一尘不染

多个FROM-含义

docker

我想在github上为Linkurious项目构建一个docker映像,这需要同时运行Neo4j数据库和Node.js。

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

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

从中我读到,如果该图像本身没有基础图像,则可能只有基础图像。

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

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

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

我想创建多个图像吗?似乎我想要的是拥有一个包含其他图像内容的图像,例如neo4j和node.js

我没有在参考手册中找到任何声明依赖项的指令。是否没有像RPM中那样的依赖关系,为了运行我的映像,调用上下文必须首先安装它需要的映像?

我糊涂了…


阅读 376

收藏
2020-06-17

共1个答案

一尘不染

什么是基本图片?

一组文件,加上EXPOSE端口ENTRYPOINTCMD
您可以添加文件并基于该基础图像构建新图像,Dockerfile并以FROM指令开头:后面提到的图像FROM是新图像的“基础图像”。

这是否意味着如果我neo4j/neo4jFROM指令中声明,则在运行映像时,neo数据库将自动运行并且可在端口7474的容器中使用?

仅当您不覆盖CMD和时ENTRYPOINT
但是图像本身就足够了:FROM neo4j/neo4j如果必须添加与neo4j的特定用途相关的文件,则可以使用neo4j

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


:有一项建议无论如何都应删除该“功能”(发行13026

问题14412提到:

使用倍数FROM并不是一个真正的功能,而是一个错误(哦,很好,限制很严格,并且FROM在Dockerfile中很少有用例的案例)。


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

可以 在单个Dockerfile中使用多个FROM 。
请参阅“ Builder模式与多阶段建立在泊坞 ”(由 亚历克斯·埃利斯 )和PR
31257
通过
TõnisTiigi

之前:

构建器模式涉及使用两个Docker映像-一个用于执行构建,另一个用于运送第一个构建的结果,而不会影响第一个映像中的构建链和工具。

后:

通用语法涉及FROM在Dockerfile中添加其他时间-以最后一条FROM语句为最终基础映像为准。要复制中间图像的伪像和输出,请使用COPY --from=<base_image_number>

Dockerfile的第一部分:

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 .

相同的 (!)Dockerfile的第二部分:

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"]

其结果将是两个图像,一个建筑,一个只有所产生的应用程序(很多, 很多 小)

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE

multi               latest              bcbbf69a9b59        6 minutes ago       10.3MB  
golang              1.7.3               ef15416724f6        4 months ago        672MB
2020-06-17