【问题标题】:How could I build docker images from nothing?我怎么能从零开始构建 docker 镜像?
【发布时间】:2018-10-30 09:45:49
【问题描述】:

我已经有一些 docker 经验,但是我构建的所有图像都是基于其他图像的。

我还是不知道第一个 docker 镜像是从哪里来的?
换句话说,如果我需要一个特定的图像,比如 ubuntu,它与官方图像完全不同怎么办?

20180928 更新:
根据目前的回答和评论,scratch 似乎是非常原始的图像。每个图像都是从它构建的。那么问题来了:什么是划痕?请各位大神用常用词解释一下好吗?

20180929 更新:
根据 cmets 中链接的信息,确实,FROM scratch 构建的图像(例如 light/hello:latest)没有额外的文件,而是添加了一些文件。从 light/hello:latest 启动容器后,除了我们添加的文件之外,还有更多的文件和目录。

现在我知道了,因为每个容器都必须有一个根文件系统才能执行,所以这些额外的文件和目录是由容器运行时实现(runC/libcontainer)基于 runC libcontainer 规范 v1 创建的,它遵循 OCI 运行时规范。

现在回到我的困惑:什么是划痕?这是 Docker 保留的一些技巧吗?就像 Java 项目一样,总是从一个 main 函数开始:public static void main(String[] args)?

更新 20181008:
现在我认为我应该弄清楚的第一个方法是 docker 图像实际上是什么。怎么可能呢?如果可能和必要,您可以在此处放置一些源代码。请给我亮光。

提前致谢。

【问题讨论】:

标签: image docker


【解决方案1】:

基础映像在其 Dockerfile 中没有 FROM 行,或者有 FROM 划痕。

父图像是您的图像所基于的图像。引用Dockerfile中FROM指令的内容。

使用临时创建一个简单的父图像

您可以使用 Docker 的保留、最小镜像、scratch 作为开始 用于构建容器的点。使用划痕“图像”信号 您希望 Dockerfile 中的下一个命令执行的构建过程 成为映像中的第一个文件系统层。

虽然中心上的 Docker 存储库中出现了 scratch ,但您不能 拉取它,运行它,或使用名称从头开始标记任何图像。相反,你 可以在你的 Dockerfile 中引用它。例如,创建一个最小的 使用从头开始的容器:

FROM scratch
ADD hello /
CMD ["/hello"]

假设您按照以下步骤构建了“hello”可执行示例 https://github.com/docker-library/hello-world/ 的说明,以及 你用 -static 标志编译它,你可以构建这个 Docker 镜像 使用这个 docker build 命令:

docker build --tag hello .

从头开始 一个明确的空图像,尤其是用于“从头开始”构建图像

此图像在构建基础图像(例如 作为 debian 和 busybox)或超级最小图像(仅包含 单个二进制文件和它需要的任何东西,例如 hello-world)。

scratch 不会向您的 docker 映像添加层。但为什么要划伤?因为

必须向容器提供根文件系统才能执行。这 容器将使用这个根文件系统(rootfs)来监禁和生成 二进制文件和系统库本地的进程 那个目录。任何要执行的二进制文件必须包含在 这个 rootfs。

develop-images baseimages

【讨论】:

  • 你能补充更多关于scratch的信息吗?它到底是什么?一堆文件和目录?我只想知道结局。
  • 非常有用的链接信息,非常感谢。我想用更流行的词来概括一下,你会吗?
【解决方案2】:

Dockerfile 可以声明自己 FROM scratch,而不是 FROM 服务器或分发映像库。 “scratch”是一个特殊的图像名称,它完全不包含任何内容——没有文件,没有目录,我认为它甚至没有图像层。

FROM scratch 最常见的用途是围绕 静态编译 二进制文件创建一个极小的图像(最常见于 Go,也可能在 C/C++ 中,在 Java 或需要解释器的 Python)。这可能看起来像

FROM scratch
COPY app /
ENTRYPOINT ["/app"]

如果您以某种方式查看图像,您只会看到单个文件 /app 加上几个注入的系统位(例如,我认为您总是会得到 /dev/proc)。这很棘手,因为没有可以运行的 shell(没有/bin 目录,除非您明确创建一个)。

另一个“scratch”出现在基础镜像中,比如this debian:stable Dockerfile

FROM scratch
ADD rootfs.tar.xz /
CMD ["bash"]

再次,从零开始,解压 Debian 安装的 tar 文件,并将其作为下一步工作的起点。

【讨论】:

  • 感谢您的回答。不要徘徊,我无法使用 shell 脚本运行容器。根本没有 bash...
猜你喜欢
  • 2019-06-22
  • 1970-01-01
  • 2020-10-06
  • 2021-11-03
  • 1970-01-01
  • 2022-11-11
  • 2016-12-12
  • 1970-01-01
  • 2017-09-15
相关资源
最近更新 更多