Docker manifest 详解
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Docker manifest 详解相关的知识,希望对你有一定的参考价值。
参考技术A 在 18.02 ( #138 )版本中添加参考链接:https://docs.docker.com/engine/reference/commandline/manifest/#push-to-an-insecure-registry
https://www.jianshu.com/p/fad6b6fb4599
该docker manifest命令本身不执行任何操作。为了对 manifest 或 manifest list 进行操作,必须有一个子命令。
1. manifest是一个文件,这个文件包含了有关于镜像信息,如层、大小和摘要。docker manifest命令还向用户提供附加信息,比如构建镜像的操作系统和体系结构。
2. manifest list 是通过制定一个或者多个镜像名称创建的镜像层列表,它可以被当作镜像名称在docker pull 和docker run 的命令中使用
理想的情况下:manifest是根据相同功能,不同的os/arch组合的镜像构建的,因此,manifest 通常被称为“多架构镜像”。
但是,用户可以创建一个指向两个镜像的manifest,然后对用户提供一个唯一的镜像名称。如:一个用于amd64的Windows上,一个用于amd上的darwin
从Docker registry v2.3和Docker 1.10 开始,Docker hub就可以pull multi architecture Docker镜像了。
manifest inspect --help
Usage: docker manifest inspect[OPTIONS][MANIFEST_LIST] MANIFEST
显示镜像的 manifest, or manifest list
Options:
--help 用法
--insecure 允许与不安全的注册表通信
-v, --verbose 输出其他信息包括 layers 和 platform
Usage: docker manifest create MANIFEST_LIST MANIFEST[MANIFEST...]
Create a local manifest list for annotating and pushing to a registry
为annotating 创建一个本地的manifest, push到镜像仓库中
Options:
-a,--amend 修改现有manifest list
--insecure 允许与不安全的注册表进行通信
--help 用法
Usage: docker manifest annotate [OPTIONS] MANIFEST_LIST MANIFEST
添加其他信息到本地镜像的manifest
Options:
--arch string 设置体系结构
--help 用法
--os string 设置操作系统
--os-version string 设置操作系统版本
--os-features stringSlice 设置操作系统功能
--variant string 设置体系结构变体
Usage: docker manifest push [OPTIONS] MANIFEST_LIST
将 manifest list 推到 repository
Options:
--help 用法
--insecure 允许推送到不安全的仓库中
-p, --purge 推送后删除本地清单列表
manifest命令仅与Docker 仓库交互。因此,它无法查询引擎以获取允许的不安全仓库列表。为了允许CLI与不安全的仓库进行交互,某些docker manifest 命令带有一个--insecure标志。对于每个create查询注册表的事务(例如),--insecure必须指定标志。此标志告诉CLI,此注册表调用可能会忽略安全性问题,例如丢失或自签名证书。同样,在manifest 推到不安全的仓库上的时候,--insecure必须指定该标志。如果未与不安全的仓库一起使用,清单命令将找不到符合默认要求的仓库。
1. 检查镜像的manifest对象
``
$ docker manifest inspect hello-world
"schemaVersion": 2,
"mediaType": "application/vnd.docker.distribution.manifest.v2+json",
"config":
"mediaType": "application/vnd.docker.container.image.v1+json",
"size": 1520,
"digest": "sha256:1815c82652c03bfd8644afda26fb184f2ed891d921b20a0703b46768f9755c57"
,
"layers": [
"mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip",
"size": 972,
"digest": "sha256:b04784fba78d739b526e27edc02a5a8cd07b1052e9283f5fc155828f4b614c28"
]
``
2. 检查镜像的manifest并获取os/arch信息
该docker manifest inspect命令带有一个可选--verbose标志,可以提供image的名称(Ref),体系结构和os(平台)。就像其他使用映像名称的docker命令一样,可以引用带有或不带有标签的映像,也可以引用摘要(例如hello-world@sha256:f3b3b28a45160805bb16542c9531888519430e9e6d6ffc09d72261b0d26ff74f)。
这是一个使用--verbose标志检查镜像的manifest的示例:
$ docker manifest inspect --verbose hello-world
"Ref": "docker.io/library/hello-world:latest",
"Digest": "sha256:f3b3b28a45160805bb16542c9531888519430e9e6d6ffc09d72261b0d26ff74f",
"SchemaV2Manifest":
"schemaVersion": 2,
"mediaType": "application/vnd.docker.distribution.manifest.v2+json",
"config":
"mediaType": "application/vnd.docker.container.image.v1+json",
"size": 1520,
"digest": "sha256:1815c82652c03bfd8644afda26fb184f2ed891d921b20a0703b46768f9755c57"
,
"layers": [
"mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip",
"size": 972,
"digest": "sha256:b04784fba78d739b526e27edc02a5a8cd07b1052e9283f5fc155828f4b614c28"
]
,
"Platform":
"architecture": "amd64",
"os": "linux"
3. 创建并推一个manifest list
要创建manifest list,首先要在本地 create manifest list,方法是指定要包含在manifest list中的组成镜像。 请记住,这已推送到镜像仓,因此,如果要推送到docker镜像仓以外的其他仓库,则需要使用仓库名称或IP和端口创建manifest list。 这类似于标记镜像并将其推送到外部镜像仓库。
创建manifest list的本地副本后,可以选择对其进行注释。 允许的注释包括体系结构和操作系统(覆盖镜像的当前值),操作系统功能以及体系结构变体。
最后,需要将清单列表推送到所需的镜像仓。 下面是对这三个命令的描述,以及将它们全部组合在一起的示例。
$ docker manifest create 45.55.81.106:5000/coolapp:v1 \
45.55.81.106:5000/coolapp-ppc64le-linux:v1 \
45.55.81.106:5000/coolapp-arm-linux:v1 \
45.55.81.106:5000/coolapp-amd64-linux:v1 \
45.55.81.106:5000/coolapp-amd64-windows:v1
Created manifest list 45.55.81.106:5000/coolapp:v1
$ docker manifest annotate 45.55.81.106:5000/coolapp:v1 45.55.81.106:5000/coolapp-arm-linux--archarm
$ docker manifest push 45.55.81.106:5000/coolapp:v1
Pushed manifest 45.55.81.106:5000/coolapp@sha256:9701edc932223a66e49dd6c894a11db8c2cf4eccd1414f1ec105a623bf16b426 with digest: sha256:f67dcc5fc786f04f0743abfe0ee5dae9bd8caf8efa6c8144f7f2a43889dc513b
Pushed manifest 45.55.81.106:5000/coolapp@sha256:f3b3b28a45160805bb16542c9531888519430e9e6d6ffc09d72261b0d26ff74f with digest: sha256:b64ca0b60356a30971f098c92200b1271257f100a55b351e6bbe985638352f3a
Pushed manifest 45.55.81.106:5000/coolapp@sha256:39dc41c658cf25f33681a41310372f02728925a54aac3598310bfb1770615fc9 with digest: sha256:df436846483aff62bad830b730a0d3b77731bcf98ba5e470a8bbb8e9e346e4e8
Pushed manifest 45.55.81.106:5000/coolapp@sha256:f91b1145cd4ac800b28122313ae9e88ac340bb3f1e3a4cd3e59a3648650f3275 with digest: sha256:5bb8e50aa2edd408bdf3ddf61efb7338ff34a07b762992c9432f1c02fc0e5e62
sha256:050b213d49d7673ba35014f21454c573dcbec75254a08f4a7c34f66a47c06aba
检查 manifest list
$ docker manifest inspect coolapp:v1
"schemaVersion": 2,
"mediaType": "application/vnd.docker.distribution.manifest.list.v2+json",
"manifests": [
"mediaType": "application/vnd.docker.distribution.manifest.v2+json",
"size": 424,
"digest": "sha256:f67dcc5fc786f04f0743abfe0ee5dae9bd8caf8efa6c8144f7f2a43889dc513b",
"platform":
"architecture": "arm",
"os": "linux"
,
"mediaType": "application/vnd.docker.distribution.manifest.v2+json",
"size": 424,
"digest": "sha256:b64ca0b60356a30971f098c92200b1271257f100a55b351e6bbe985638352f3a",
"platform":
"architecture": "amd64",
"os": "linux"
,
"mediaType": "application/vnd.docker.distribution.manifest.v2+json",
"size": 425,
"digest": "sha256:df436846483aff62bad830b730a0d3b77731bcf98ba5e470a8bbb8e9e346e4e8",
"platform":
"architecture": "ppc64le",
"os": "linux"
,
"mediaType": "application/vnd.docker.distribution.manifest.v2+json",
"size": 425,
"digest": "sha256:5bb8e50aa2edd408bdf3ddf61efb7338ff34a07b762992c9432f1c02fc0e5e62",
"platform":
"architecture": "s390x",
"os": "linux"
]
推送到不安全的镜像仓库
$ docker manifest create --insecure myprivateregistry.mycompany.com/repo/image:1.0 \
myprivateregistry.mycompany.com/repo/image-linux-ppc64le:1.0 \
myprivateregistry.mycompany.com/repo/image-linux-s390x:1.0 \
myprivateregistry.mycompany.com/repo/image-linux-arm:1.0 \
myprivateregistry.mycompany.com/repo/image-linux-armhf:1.0 \
myprivateregistry.mycompany.com/repo/image-windows-amd64:1.0 \
myprivateregistry.mycompany.com/repo/image-linux-amd64:1.0
$ docker manifest push --insecure myprivateregistry.mycompany.com/repo/image:tag
AndroidMainfest详解
基于TV settings和SettingsProvider
Android启动模式对activity行为的影响
AndroidManifest.xml文件详解
Manifest文件中,application和activity标签属性详解
android之manifest.xml内provider详解
coreApp
<manifest
···
coreApp="true"
···
</manifest>
- 在manifest中增加该属性,其实并不是代表该APP具有系统权限,而是把该类app归类为核心APP,核心app其实也是最小
Android framework
系统。
android:supportsRtl
<application
···
android:supportsRtl="true"
··· >
- 声明你的application是否愿意支持从右到左(原来RTL就是
right-to-left
的缩写...)的布局。如果设置为true,targetSdkVersion设置为17或更高,各种RTL的API将被激活,系统使用您的应用程序可以显示RTL布局。如果targetSdkVersion设置为16或更低的设置为false,RTL的API将被忽略或没有影响您的应用程序将具有相同的行为无论对用户现场的选择相关的布局方向(你的布局会从左至右)。此属性的默认值是false。 - Android 4.1(Jelly Bean)在 TextView 和 EditText 元素里对
双向文字顺序
提供了有限的功能支持,允许应用程序在编辑和显示字符的时候,能够同时支持从左到右(LTR)以及从右到左(RTL)的排列格式。
android:configChanges
<activity
···
android:configChanges="keyboard|keyboardHidden|navigation"
··· >
- android中的组件Activity在manifest.xml文件中可以指定参数
android:ConfigChanges
,用于捕获手机状态的改变。 - 在Activity中添加了
android:configChanges
属性,在当所指定属性(Configuration Changes
)发生改变时,通知程序调用onConfigurationChanged()
函数。 设置方法:将下列字段用
|
符号分隔开,例如:locale|navigation|orientation
mcc
移动国家号码,由三位数字组成,每个国家都有自己独立的MCC,可以识别手机用户所属国家
mnc
移动网号,在一个国家或者地区中,用于区分手机用户的服务商
locale
所在地区发生变化
touchscreen
触摸屏已经改变。(这不应该常发生)
keyboard
键盘模式发生变化,例如:用户接入外部键盘输入
keyboardHidden
用户打开手机硬件键盘
navigation
导航型发生了变化。(这不应该常发生)
orientation
设备旋转,横向显示和竖向显示模式切换
fontScale
全局字体大小缩放发生改变
android:priority
<intent-filter
···
android:priority="3"
··· >
</intent-filter>
- Android:priority执行优先级,默认为0,值越大优先级越高。
- 优先级的概念用于描述控件的 intent的filter的类型。这个属性只对activity和 receivers是有意义的。
- 隐式调用activity的情况下:如果多个activity满足响应的条件,系统只会触发 priority高的那个activity。
- 有序广播发出的情况下:如果多个receiver满足响应的条件,系统会优先触发prioriyt搞的那个receiver。
- priority必须是整数,默认是0,范围是[-1000, 1000]
Android:clearTaskOnLaunch
<activity
···
android:clearTaskOnLaunch="true"
··· >
</activity>
- 假设有A,B两个Activity,在AndroidManifest.xml中将A Activity的设置了
android:clearTaskOnLaunch="true"
然后A中的操作启动了B,进入了B:
(1)如果此时用户按了Home键回到主屏幕上,然后又点击了主屏幕上的A的icon图标启动应用。那么此时不是进入B,而是进入了A
(2)如果用户按了屏幕下方的”最近任务列表“键,调出最近任务列表中,出现的是B,用户点击,此时又进入的是B
以上就是设置了android:clearTaskOnLaunch="true"
后的Activity运行的细微差别。属性android:clearTaskOnLaunch
,顾名思义,就是说,当设置此属性为true时候,每一次启动此Activity后,将清空以此Activity为根的Task
android:exported
<activity
···
android:exported="true"
··· />
- android:exported 是Android中的四大组件
Activity
,Service
,Provider
,Receiver
四大组件中都会有的一个属性
总体来说它的主要作用是:是否支持其它应用调用当前组件。
默认值:如果包含有intent-filter默认值为true;没有intent-filter默认值为false
excludeFromRecents
<activity
···
android:excludeFromRecents="true"
··· >
</activity>
android:excludeFromRecents="true"
,设置为true后,当用户按了最近任务列表
时候,该Task不会出现在最近任务列表中,可达到隐藏应用的目的
android:windowSoftInputMode
<activity
···
android:windowSoftInputMode="stateVisible"
··· >
</activity>
activity主窗口与软键盘的交互模式,可以用来避免输入法面板遮挡问题,Android1.5后的一个新特性。
这个属性能影响两件事情:
【一】当有焦点产生时,软键盘是隐藏还是显示
【二】是否减少活动主窗口大小以便腾出空间放软键盘
它的设置必须是下面列表中的一个值,或一个state…
值加一个adjust…
值的组合。在任一组设置多个值——多个”state…”values,例如&mdash有未定义的结果。各个值之间用"|"分开。例如:
<activity Android:windowSoftInputMode="stateVisible|adjustResize". . . >
在这设置的值(除stateUnspecified
和adjustUnspecified
以外)将覆盖在主题中设置的值
各值的含义:【A】
stateUnspecified
:软键盘的状态并没有指定,系统将选择一个合适的状态或依赖于主题的设置
【B】stateUnchanged
:当这个activity出现时,软键盘将一直保持在上一个activity里的状态,无论是隐藏还是显示
【C】stateHidden
:用户选择activity时,软键盘总是被隐藏
【D】stateAlwaysHidden
:当该Activity主窗口获取焦点时,软键盘也总是被隐藏的
【E】stateVisible
:软键盘通常是可见的
【F】stateAlwaysVisible
:用户选择activity时,软键盘总是显示的状态
【G】adjustUnspecified
:默认设置,通常由系统自行决定是隐藏还是显示
【H】adjustResize
:该Activity总是调整屏幕的大小以便留出软键盘的空间
【I】adjustPan
:当前窗口的内容将自动移动以便当前焦点从不被键盘覆盖和用户能总是看到输入内容的部分
android:noHistory
<activity
···
android:noHistory="true"
··· >
</activity>
- noHistory:如果设置true,当离开activity并不可见时,此activity会从栈中移除并不留下记录
- 默认值为false
android:enabled
<activity-alias
···
android:enabled="false"
··· >
</activity-alias>
- Android 系统能否实例化应用程序中的各组件 —
true
表示可以,false
表示不允许。 如果此值设为true
,则由每个组件的 enabled 属性确定自身的启用或禁用。 如果此值设为false
,则覆盖组件的设置值;所有组件都将被禁用 - 默认值是true
android:targetActivity
<activity-alias
···
android:targetActivity=".users.RestrictedProfileActivity"
··· >
</activity-alias>
- 这个属性用于设置通过别名所能够激活的那个Activity的名字。这个名字必须跟它前面的
<activity>
元素的name属性匹配。
android:finishOnCloseSystemDialogs
<activity
···
android:finishOnCloseSystemDialogs="true"
··· >
</activity>
- 当
关闭系统窗口
请求出现时是否销毁Activity,true为销毁
android:launchMode
<activity
···
android:launchMode="singleTop"
··· >
</activity>
- launchMode在多个Activity跳转的过程中扮演着重要的角色,称之为启动模式。有如下四种:
standard
:不管有没有已存在的实例,都生成新的实例
singleTop
:如果发现有对应的Activity实例正位于栈顶,则重复利用,不再生成新的实例
singleTask
:如果发现有对应的Activity实例,则使此Activity实例之上的其他Activity实例统统出栈,使此Activity实例成为栈顶对象,显示到幕前
singleInstance
:比较复杂,详见延伸阅读
延伸阅读:Activity的四种launchMode
android:killAfterRestore
<application
···
android:killAfterRestore="false"
··· >
</application>
- 在执行全系统的恢复操作时,配置恢复后相关的应用程序是否要被终止。 单个包的恢复操作不会导致程序被关闭。 全系统的恢复操作一般只会发生一次,即第一次配置手机时。 第三方应用程序通常不需要用到本属性
- 默认值是
true
,表示全系统恢复过程中,应用程序在处理完数据后将被关闭
android:process
<application
···
android:process="system"
··· >
</application>
- 通过在声明文件中设置
android:process
属性,我们可以让组件(例如Activity, Service等)和应用(Application)创建并运行于我们指定的进程中
android:allowClearUserData
<application
···
android:allowClearUserData="false"
··· >
</application>
- 是否给以用户删除用户数据的权限
- 如果为true应用管理者就拥有清除数据的权限;false没有
- 默认为true
android:backupAgent
<application
···
android:backupAgent="SettingsBackupAgent"
··· >
</application>
- 实现应用的备份代理的类名,BackupAgent的子类。这个属性的名称因该是全限定类名(如,
com.example.project.MyBackupAgent
)。但是,如果名称的首字母被设置为点号,也可以为类名(如,.MyBackupAgent
), 他将被追加到在< manifest />
元素中定义的包名后 - 没有默认值
android:multiprocess
<application
···>
<provider
···
android:multiprocess="false"
··· >
</application>
- 该属性表示Activity的实例是否可以运行在启动它的组件所在的应用程序进程中。如果可以,则为true,否则为false
- 默认值是false
android:authorities
<application
···>
<provider
···
android:authorities="settings"
··· >
</application>
- 标识内容提供器范围内的数据URI的授权列表,有多个授权时,要用分号来分离每个授权
android:writePermission
<application
···>
<provider
···
android:writePermission="android.permission.WRITE_SETTINGS"
··· >
</application>
- 这个属性用于设置修改内容提供器的数据时,客户端所必须要有的权限
android:singleUser
<application
···>
<provider
···
android:singleUser="true"
··· >
</application>
- 表示单用户,所有用户使用的Activity是同一个,和singletop,singletask的区别是,无论如何启动,他总是一个
android:initOrder
<application
···>
<provider
···
android:initOrder="100"
··· >
</application>
- 这个属性用于定义内容提供器应该被实例化的顺序,这个顺序是相对与相同进程所拥有的其他内容提供器的。当内容提供器间有相互的依赖时,就需要设置这个属性,以确保它们能够按照其依赖的顺序被创建。这个属性值是一个简单的整数,大的数字要被优先初始化
以上是关于Docker manifest 详解的主要内容,如果未能解决你的问题,请参考以下文章
AndroidManifest.xml <manifest> 包属性没有命名空间
Manifest merger failed : Attribute application@label value=(@string/app_name)
解决Docker:Error response from daemon: manifest for xxx:latest not found: manifest unknown: manifest