我想在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这样的依赖关系,为了运行我的图像,调用上下文必须首先安装它需要的图像?
我糊涂了...
什么是基本形象?
一组文件,加上EXPOSE
'd端口,ENTRYPOINT
和CMD
。
您可以添加文件并基于该基本图像构建新图像,新的Dockerfile
以FROM
指令开头:FROM
之后提到的图像是新图像的“基本图像”。
这是否意味着如果我在
neo4j/neo4j
指令中声明FROM
,那么当运行我的图像时,neo数据库将自动运行并在端口7474上的容器中可用?
只有你不覆盖CMD
和ENTRYPOINT
。
但是图像本身就足够了:如果你必须为FROM neo4j/neo4j
的特定用途添加与neo4j
相关的文件,你会使用neo4j
。
FROM
可以在单个Dockerfile中多次出现
别 :有提议删除该“功能”无论如何(issue 13026)
Issue 14412提到:
使用多个
FROM
并不是一个真正的功能,而是一个错误(哦,这个限制非常严格,并且Dockerfile中的多个FROM
用例很少)。
2017年5月更新(18个月后),docker (moby) 17.05-ce。
多个FROM可以在单个Dockerfile中使用。 参见Builder pattern vs. Multi-stage builds in Docker的“Alex Ellis”(PR 31257)和Tõnis Tiigi。
之前:
构建器模式涉及使用两个Docker镜像 - 一个用于执行构建,另一个用于传送第一个构建的结果,而不会在第一个图像中构建构建链和工具。
后:
一般语法包括在Dockerfile中添加
FROM
额外的时间 - 以最后一个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