manifest是什么文件

manifest是什么文件,第1张

manifest为一种软件,属于AndroidManifest.xml文件,在简单的Android系统的应用中提出了重要的信息,它可以运行任何应用程序的代码。

MANIFEST.MF:这个manifest文件定义了与扩展和包相关的数据。单词“manifest”的意思是“显示”。

打开Java的JAR文件经常可以看到文件中包含着一个META-INF目录,这个目录下会有一些文件,其中必有一个MANIFEST.MF,这个文件描述了该Jar文件的很多信息。

扩展资料

每个安卓应用程序必须有一个AndroidManifest.xml文件,在app/manifests目录中。它在简单的Android系统的应用中提出了重要的信息,信息系统必须具备之前,它可以运行任何应用程序的代码。

除其他事项外,清单中执行下列 *** 作:

它给应用程序的Java包命名,包的名称作为应用程序的唯一标识符。

它描述了应用程序的组件的活动、服务,广播接收机,内容提供商,应用程序组成。它命名的类,实现每个组件,并出版自己的能力(例如,可以处理哪些意图的消息)。这些声明让Android系统知道这些组件是什么和在什么条件下,他们可以推出。

它决定哪些进程将运行应用程序组件。它决定了应用程序必须有权限才能访问受保护的API部分,并与其他应用程序进行交互。它还决定了其他人与应用程序的组件交互所需要的权限。它宣布了Android API的应用程序需要的最低水平。

参考资料来源:百度百科-manifest

参考资料来源:百度百科-MANIFEST.MF

一、目录结构

Registry的配置文件中可以指定registry的运行目录(实验用本地文件系统作为后端存储),registry会在这个目录中建立相应的目录结构,我在本地启动一个registry服务,然后只push一个centos镜像上去。镜像名称是localhost:5000/library/centos:latest,然后registry在本地创建了如图1所示的目录。

图 1 registry目录

为了显示方便,我只截取了64位ID的前一部分。可以看到,目录大体分为两个:一个是blobs,一个是repositories。blobs中主要存放数据文件,可以看出都是经过sha256计算后的ID。repositories目录中放镜像的描述信息,记录了一个镜像有哪些layer,tag对应的manifest文件,link文件是一个文本文件,内容是一个形如“sha256:cf34a09a90b54c…”的64位ID,这个ID对应在blob中的文件其实就是这个image的manifest文件。

二、Manifest文件

manifest文件描述了一个镜像的元信息,包括了layer的数据ID,layer的配置等,文件格式是json形式的文本文件。

docker镜像可以分为V1和V2,在1.9以后镜像格式有一些变化。为了向前兼容V1版本的docker,docekr

registryV2使用的manifest也对应地分为Schema1和Schema2,两者可以通过官方对于manifest的解释可以参考[1]和[2]。这里实验都是在schema1上做的。

Schema1主要包含如下信息:

name:image的仓库(repository)名,比如localhost:5000/library/centos:latest这个镜像的repository name是library/centos

tag:该镜像的tag

architecture:指该镜像的宿主机的 *** 作系统架构,如“amd64”

fsLayers:该字段是一个数组,数组中的元素分别指明了各层对应的数据文件的sha256ID,数组的第1个就是镜像的最顶层,第2个是次顶层…以此类推,值得注意的是,不同层的fsLayer

ID

有可能一样,是因为有些层是空的,只有一些配置信息。当执行了一个不涉及文件 *** 作的命令,这时候就会形成空fsLayer,空fsLayer计算出来的sha256ID也都是一样的了。镜像的一个layer,是由文件系统(比如新增的文件)fsLayer以及配置信息构成的,layer在docker的代码层面又被称为image,因为任意一个layer都可以作为顶层layer,被docker

image信息引用,从而成为一个image。所以需要区分fsLayer与layer。

history:该字段也是一个数组,是为了兼容v1而设置的,指明了每个layer的配置信息,数组第一项对应的是镜像的最顶层,与fslayer一起构成了一个layer。数组元素是一个json格式的map对象,key为“v1Compatibility”,值为一个字符串,该字符串就是layer的配置信息,可以直接用json.Unmrashal成为一个V1Image结构体(定义可以参考代码github.com/docker/docker/image/image.go

L31)

schemaVersion:该manifest的版本,一个int型,如 1。

三、Tar包形式的镜像

Docker中有个save和load命令。save命令可以将一个docker镜像导出,把这个镜像从最顶层到最底层的所有layer一起导出到一个tar包中,然后就可以随意拷贝、发送这个tar包到别的机器,最后可以用load命令把这个镜像重新加载进docker。

如果我们把一个镜像从registry里拿出来,按照save成的tar包格式来组织,然后使用load命令加载,这样就实现了不通过docker pull命令来下载镜像,可以根据这个原理做第三方镜像下载工具。

所以我们先来看一下镜像的tar包形式是什么样的,我使用save命令导出了centos镜像,解压后目录结构如图2所示:

图 2 镜像tar包解压后的目录

下面对各文件进行解释:

根目录下的repositories文件,描述了这个镜像的名字,tage,还有顶层layer的id

不同的文件夹代表了不同的layer。

json:layer的配置信息,如创建时间,执行命令等。

layer.tar:layer中包含的文件,如果是空layer,layer.tar解压后就是空的。

VERSION: 版本信息。

四、从registry导出镜像

我们对比tar包中的文件和registry中的文件,不难发现其中的对应关系,json、VERSION还有repositories文件都是可以从manifest中导出。

json文件其实就是之前提到的history字段中v1Compatibilitiy,不同的是manifest中的这个字段中有很多转义符,我们需要去掉这些转义符,方法是先Unmarshal成为一个V1Image结构体,然后在json.Marshal转回字符串就好。

layer.tar其实就是blobs中对应的data文件,直接复制出来然后改个名字就可以。

VERSION是manifest中的schemaVersion。

repositories文件内容很简单,格式是{“imageName”:{“tag”:”topLayerID”}},所以按照这个格式从manifest中找到对应的数据填进去就ok。

这些文件都准备好了以后,就可以准备打包成tar包了,直接使用linux中自带的tar命令,这里需要注意的一点是,应该使用“只打包不压缩”的选项。生成tar包后就可以直接使用docker load命令导入了。

我这么做了,是可以成功地导入一个镜像。但是发现存在一个问题:使用上述方式导入的镜像,每个layer的ID和我直接用docker

pull命令下载下的不一样,而且docker

pull得到的ID从未在manifest和registry中的任何地方出现过。而且不管我使用新的机器还是重新pull,得到的ID都是一样的。经过阅读docker的代码我才发现,layerID不是随机生成的,也不是manifest中写道的id,而是算出来的。下面就说一下计算过程。

我们最终需要的layerID在docker源码中叫做StrongID,StrongID是把一个byte数组做Hash后得到的,这个byte数组的生成需要三个对象:v1Compatibility,blobSum(manifest中的fsLayerID),parent(父layer的StrongID),数组生成方法参考image.go中的MakeImageConfig方法(docker

1.9),基本 *** 作就是把一个json对象转成字节数组。因为有parent字段的存在,需要从最底层的layer开始计算,逐步迭代,最终的到top

layer的ID。最后要做的工作就是替换json文件中的id字段和parent字段成为新计算出来的ID即可。同样地,文件夹名也要做相应改变。

增量导入:如果本地已经存在某些layer的情况,我们只用打包新的layer即可,因为导入时候docker会检测这个layer是否存在,而且有parent信息来保证layer之间的关系。

这个问题首先你要明白什么是"镜像"镜象就是一种文件形式,可以把许多文件做成一个镜象文件。比如你的系统,本来有很多文件,做成镜象后就一个文件,与GHOST等程序放在在一个盘里用GHOST等软件打开后,又恢复成许多文件,总之用镜象给你装系统就是原样复制一份现有系统的意思,当然里面的杀毒软件等也是一样复制过来的。 镜像文件的应用范围比较广泛,最常见的应用就是数据备份(如软盘和光盘)。随着宽带网的普及,有些下载网站也有了ISO格式的文件下载,方便了软件光盘的制作与传递。常见的镜像文件格式有ISO、BIN、IMG、TAO、DAO、CIF、FCD。明白了什么是镜像文件后,Linux镜像就不难理解.这个镜像文件里装载的信息是Linux系统信息..使用软件打开这个镜像文件后你得到就是一个完整的Linux系统...


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/8894262.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-22
下一篇2023-04-22

发表评论

登录后才能评论

评论列表(0条)

    保存