我已经有一些docker经验,但是我构建的所有图像都是基于其他图像。
我还是不知道第一个docker镜像是哪里来的?
换句话说,如果我需要一个与官方图像有很大不同的垂直图像,例如ubuntu,该怎么办?
于20180928更新:
根据当前的答案和评论,看来scratch
是非常原始的图像。每个图像的确从中生成。所以这是一个问题:什么是刮擦?你们能用常用词解释一下吗?
于20180929更新:
根据评论中链接的信息,确实,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镜像实际上是什么。怎么做呢?如果可能和必要,您可以在此处放置一些源代码。请给我看看光。
谢谢。
答案 0 :(得分:2)
基本映像在其Dockerfile中没有FROM行,或者具有 FROM 临时。
父图像是您的图像所基于的图像。它引用Dockerfile中的 FROM 指令的内容。
从头开始创建简单的父图像
您可以使用Docker保留的最小图像刮痕作为开始 建造集装箱的地点。使用暂存的“图像”信号来 您想要Dockerfile中的下一个命令的构建过程 成为图像中的第一个文件系统层。
当刮擦出现在集线器上Docker的存储库中时,您将无法 拉动它,运行它或标记任何带有刮擦名称的图像。相反,你 可以在您的Dockerfile中引用它。例如,创建一个最小 临时使用的容器:
$("#checkAll").change(function(){
if(this.checked){
$(".checkbox").each(function(){
this.checked=true;
$(this).parent().parent().addClass('selected')
})
}else{
$(".checkbox").each(function(){
this.checked=false;
$(this).parent().parent().removeClass('selected')
})
}
});
假设您按照以下步骤构建了“ hello”可执行示例 https://github.com/docker-library/hello-world/中的说明,以及 使用-static标志对其进行编译,则可以构建此Docker映像 使用以下docker build命令:
FROM scratch
ADD hello /
CMD ["/hello"]
从头开始 一个明显为空的图像,尤其是用于构建“从零开始”的图像
此图像在构建基础图像(例如 如debian和busybox)或超级最小图片(仅包含一个 单个二进制文件以及所需的任何二进制文件,例如hello-world)。
scratch不会在您的docker映像中添加层。但是为什么要抓挠?是因为
必须将根文件系统提供给容器才能执行。的 容器将使用此根文件系统(rootfs)监禁并生成 二进制文件和系统库所在的内部进程 该目录。任何要执行的二进制文件必须包含在 这个rootfs。
答案 1 :(得分:2)
Dockerfile可以声明自己FROM
,而不是FROM scratch
服务器或分发映像库。 “ scratch”是一个特殊的图像名称,绝对不包含任何内容–没有文件,没有目录,我认为它甚至没有图像层。
FROM scratch
的最常见用法是围绕静态编译二进制文件创建一个非常小的图像(大多数情况下在Go中,在C / C ++中也可能,而在诸如需要解释器的Java或Python)。看起来像
FROM scratch
COPY app /
ENTRYPOINT ["/app"]
如果要以某种方式查看图像,您只会看到单个文件/app
以及几个注入的系统位(我认为您总是会看到/dev
和/proc
例如)。这很棘手,因为没有外壳程序可以运行(除非明确创建目录,否则没有/bin
目录)。
出现“刮擦”的另一个位置是在基础图像中,例如this debian:stable Dockerfile:
FROM scratch
ADD rootfs.tar.xz /
CMD ["bash"]
再次,从一无所有开始,解压Debian安装程序的tar文件,并将其用作进行下一步工作的起点。