小编典典

多个 FROM - 这意味着什么

all

我想在 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 那样的依赖关系,为了运行我的图像,调用上下文必须首先安装它需要的图像?

我很困惑…


阅读 72

收藏
2022-07-18

共1个答案

小编典典

截至 2017 年 5 月,FROM单个 Dockerfile 中可以使用多个 s。
请参阅“构建器模式与 Docker 中的多阶段构建”(Alex Ellis撰写)和TCrerinis Tiigi
撰写的PR
31257

一般语法涉及FROM在 Dockerfile 中添加额外的时间 -
以最后一条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"]

结果将是两张图像,一张用于构建,一张仅包含生成的应用程序( 小得多

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE

multi               latest              bcbbf69a9b59        6 minutes ago       10.3MB  
golang              1.7.3               ef15416724f6        4 months ago        672MB

什么是基本图像?

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

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

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

2022-07-18