我怎么能一无所有构建Docker映像?

时间:2018-09-28 06:47:36

标签: image docker

我已经有一些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镜像实际上是什么。怎么做呢?如果可能和必要,您可以在此处放置一些源代码。请给我看看光。

谢谢。

2 个答案:

答案 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。

develop-images baseimages

答案 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文件,并将其用作进行下一步工作的起点。