我已经有一些 Docker 经验,但我构建的所有镜像都是基于其他镜像的。
我还是不知道第一个docker镜像是从哪里来的?
换句话说,如果我需要一个特定的镜像,比如 ubuntu,与官方镜像有很大不同,该怎么办?
20180928 更新:
根据目前的答案和评论,这似乎scratch是非常原始的图像。每个图像都是由它构建的。那么问题来了:什么是scratch?请大家用常用词解释一下好吗?
20180929 更新:
根据评论中链接的信息,确实,构建的图像(例如 light/hello:latest)FROM scratch没有额外的文件,但添加了内容。从 light/hello:latest 启动容器后,除了我们添加的文件之外,还有更多的文件和目录。
现在我知道,由于每个容器都必须有一个根文件系统才能执行,因此这些额外的文件和目录是由容器运行时实现(runC/libcontainer)基于 runC libcontainer 规范 v1 创建的,该规范遵循 OCI 运行时规范。
现在回到我的困惑:什么是划痕?这是 Docker 保留的一些技巧吗?就像 Java 项目一样,总是以 main 函数开始:public static void main(String[] args)?
更新 20181008:
现在我认为我应该弄清楚的第一个方法是 Docker 镜像实际上是什么。怎么办呢?如果可能并且有必要,您可以将一些源代码放在这里。请给我带来光明。
提前致谢。
基础镜像的Dockerfile 中要么没有 FROM 行,要么有FROM行。
\n\n父图像是您的图像所基于的图像。它指的是Dockerfile 中FROM指令的内容。
\n\n使用scratch创建一个简单的父镜像
\n\n\n\n\n您可以使用 Docker\xe2\x80\x99s 保留的最小映像、暂存作为构建容器的起点。使用 scrap \xe2\x80\x9cimage\xe2\x80\x9d 向构建过程发出信号,表明您希望 Dockerfile 中的下一个命令成为映像中的第一个文件系统层。
\n\n虽然 scrap 出现在集线器上的 Docker\xe2\x80\x99s 存储库中,但您可以\xe2\x80\x99t\n 拉取它、运行它或使用名称 scrap 标记任何映像。相反,您可以在 Dockerfile 中引用它。例如,要使用 scrap 创建一个最小\n 容器:
\n
FROM scratch\nADD hello /\nCMD ["/hello"]\nRun Code Online (Sandbox Code Playgroud)\n\n\n\n\n假设您按照https://github.com/docker-library/hello-world/上的说明构建了 \xe2\x80\x9chello\xe2\x80\x9d 可执行示例,并使用-static 标志,您可以使用以下 docker build 命令构建此 Docker 映像:
\n
docker build --tag hello .\nRun Code Online (Sandbox Code Playgroud)\n\n从头开始\n一个明确的空图像,特别是“从头开始”构建图像
\n\n\n\n\n此映像在构建基础映像(例如 debian 和 busybox)或超最小映像(仅包含单个二进制文件及其所需的任何内容,例如 hello-world)的上下文中最有用。
\n
scrap 不会向您的 docker 镜像添加一层。但为什么要抓伤呢?它是因为
\n\n\n\n\n\n必须向容器提供根文件系统以供执行。容器将使用此根文件系统 (rootfs) 来监禁和生成进程,其中二进制文件和系统库位于该目录的本地。任何要执行的二进制文件都必须包含在该 rootfs 中。
\n