概述
參考: OCI 官網(wǎng) OCI 鏡像規(guī)范
OCI鏡像規(guī)范定義一個(gè)鏡像包含一個(gè)manifest剔宪、一個(gè)image index(可選)、一組文件系統(tǒng)layer和一個(gè)配置文件。
OCI 鏡像規(guī)范的主要目的:
統(tǒng)一標(biāo)準(zhǔn)化容器鏡像格式,讓標(biāo)準(zhǔn)鏡像能夠在各容器軟件下構(gòu)建腐泻、傳遞及準(zhǔn)備容器鏡像運(yùn)行。
Image 規(guī)范的高層組件包含:
Image Manifest 清單文件是組成一個(gè)容器 image 的組件描述文檔
Image Index (可選) 更高層的manifest文件队询,指向一組 manifests 和 descriptors 列表
Image Layout 鏡像布局派桩,表示一個(gè)鏡像的內(nèi)容布局
Filesystem Layer 描述一個(gè)容器文件系統(tǒng)的一個(gè)"變化集合"
Image Configuration 配置文件包含如應(yīng)用參數(shù)、環(huán)境等信息
Conversion 如何解析的描述文檔
Descriptor 描述了類型蚌斩、元數(shù)據(jù)和內(nèi)容尋址的格式描述文件
Signatures (可選 ) 簽名是基于簽名的圖像內(nèi)容的地址
Naming (可選 ) 命名是聯(lián)合基于DNS铆惑,可以授權(quán)
OCI Media Type 文件類型:
Media Type | 說明 |
---|---|
application/vnd.oci.descriptor.v1+json | Content Descriptor 內(nèi)容描述文件 |
application/vnd.oci.layout.header.v1+json | OCI Layout 布局描述文件 |
application/vnd.oci.image.index.v1+json | Image Index 高層次的鏡像元信息文件 |
application/vnd.oci.image.manifest.v1+json | Image Manifest 鏡像元信息文件 |
application/vnd.oci.image.config.v1+json | Image Config 鏡像配置文件 |
application/vnd.oci.image.layer.v1.tar | Image Layer 鏡像層文件 |
application/vnd.oci.image.layer.v1.tar+gzip | Image Layer 鏡像層文件gzip壓縮 |
application/vnd.oci.image.layer.nondistributable.v1.tar | Image Layer 非內(nèi)容尋址管理 |
application/vnd.oci.image.layer.nondistributable.v1.tar+gzip | Image Layer, gzip壓縮 非內(nèi)容尋址管理 |
類型關(guān)系圖
OCI Content Descriptor
OCI 鏡像由幾部分組成,每個(gè)組件都是存儲在一個(gè)目錄結(jié)構(gòu)中送膳。每個(gè)組件之間都是通過內(nèi)容尋址的方式互相引用员魏。Content Descriptor 描述了一個(gè)目標(biāo)內(nèi)容的位置。Content Descriptor 包含:內(nèi)容的類型叠聋、內(nèi)容的標(biāo)識符撕阎、內(nèi)容的大小。Content Descriptor 必須通過嵌入到其他格式中使用碌补。
Content Descriptor 屬性
- mediaType string
- digest string
- size int64
- urls array of strings
- annotations string-string map
- data string (保留字段)
摘要和校驗(yàn)
digest屬性是Descriptor的核心虏束,扮演了內(nèi)容的標(biāo)識符的角色。digest使用了防碰撞的哈希算法唯一的標(biāo)識了內(nèi)容厦章。如果標(biāo)識符能夠以安全的獲取镇匀。那么就算內(nèi)容通過了不安全的來源獲取,也能獨(dú)立計(jì)算出標(biāo)識符對內(nèi)容的正確性進(jìn)行確認(rèn)袜啃。
digest的格式要求與示例:(sha256已經(jīng)是一個(gè)廣泛使用的Hash算法)
digest := algorithm ":" hex
algorithm := /[a-z0-9_+.-]+/
hex := /[a-f0-9]+/
sha256:6c3c624b58dbbcd3c0dd82b4c53f04194d1247c6eebdaab7c610cf7d66709b3b
Content Descriptor 示例
這個(gè) Content Descriptor 描述了一個(gè)Manifest
{
"mediaType": "application/vnd.oci.image.manifest.v1+json",
"size": 7682,
"digest": "sha256:5b0bcabd1ed22e9fb1310cf6c2dec7cdef19f0ad69efa1f392e94a4333501270"
}
OCI Image Manifest 鏡像清單格式規(guī)范
Manifest 的三大主要目標(biāo):
內(nèi)容可尋址(通過 hash 算法為鏡像和它的組件生成唯一ID)
支持多種平臺的架構(gòu)鏡像(由一個(gè)更上層的 manifest 說明包含的鏡像 manifests 其具體平臺的版本情況)
能被解析成為 OCI 運(yùn)行時(shí)規(guī)范
image manifest 包括一個(gè) Image Config 和 一組 Image Layers 汗侵。
application/vnd.oci.image.manifest.v1+json
定義:
字段名 | 類型 | 必須 | 說明 |
---|---|---|---|
schemaVersion | int | 必須 | 當(dāng)前版本 |
mediaType | string | 保留 | 用于標(biāo)識當(dāng)前文件是什么類型的 |
config | descriptor | 必須 | 用于標(biāo)識鏡像的配置文件的位置<br />application/vnd.oci.image.config.v1+json |
layers | array of descriptor | 列表中的每一個(gè)成員都是一個(gè)鏡像層,最底層的鏡像在列表的第一項(xiàng),其他各層按照堆疊順序依次排列在后面晃择。最終得到的文件系統(tǒng)應(yīng)該和在一個(gè)空文件夾上堆疊各層得到的結(jié)果一樣冀值。用于堆疊的空文件夾的各種權(quán)限是不確定的。鏡像層的mediaType宫屠,有比較多的選擇: application/vnd.oci.image.layer.v1.tar application/vnd.oci.image.layer.v1.tar+gzip application/vnd.oci.image.layer.nondistributable.v1.tar application/vnd.oci.image.layer.nondistributable.v1.tar+gzip |
|
annotations | string-string map | 注釋 |
manifest 示例:
{
"schemaVersion": 2,
"config": {
"mediaType": "application/vnd.oci.image.config.v1+json",
"size": 7023,
"digest": "sha256:b5b2b2c507a0944348e0303114d8d93aaaa081732b86451d9bce1f432a537bc7"
},
"layers": [
{
"mediaType": "application/vnd.oci.image.layer.v1.tar+gzip",
"size": 32654,
"digest": "sha256:e692418e4cbaf90ca69d05a66403747baa33ee08806650b51fab815ad7fc331f"
},
{
"mediaType": "application/vnd.oci.image.layer.v1.tar+gzip",
"size": 16724,
"digest": "sha256:3c3a4604a545cdc127456d94e421cd355bca5b528f4a9c1905b15da2eb4a4c6b"
},
{
"mediaType": "application/vnd.oci.image.layer.v1.tar+gzip",
"size": 73109,
"digest": "sha256:ec4b8955958665577945c89419d1af06b5f7636b4ac3da7f12184802ad867736"
}
],
"annotations": {
"com.example.key1": "value1",
"com.example.key2": "value2"
}
}
OCI Image Index 鏡像索引格式規(guī)范
Image Index是一個(gè)更高層次的Manifest,一般在一個(gè)鏡像需要提供多個(gè)平臺支持時(shí)使用滑蚯。
MediaType:application/vnd.oci.image.index.v1+json
字段名 | 類型 | 必須 | 說明 |
---|---|---|---|
schemaVersion | int | 必須 | 必須填2(為了兼容老版本的Docker) |
mediaType | string | 保留 | 用于標(biāo)識當(dāng)前文件是什么類型的 |
manifests | array of objects | 必須 | 給出了對于特定平臺的Manifests列表 |
mediaType string Manifests | string | application/vnd.oci.image.manifest.v1+json | |
platform | object | 可選 | 描述了Manifest中描述的鏡像是運(yùn)行 在哪一個(gè)指定的平臺 |
architecture | string | 必須 | 指定了CPU的架構(gòu)類型 |
os | string | 必須 | 指定了操作系統(tǒng)的類型 |
os.version | string | 可選 | 指定操作系統(tǒng)的版本要求 |
os.features | array of strings | 可選 | 指定了一些對于系統(tǒng)的特殊要求 |
variant | string | 可選 | 指定了CPU的版本要求 |
features | array of strings | 可選 | 指定了一些對于CPU指令集的特殊要求浪蹂。 (比如sse4、aes) |
annotations | string-string map | 注解 |
index 示例:
{
"schemaVersion": 2,
"manifests": [
{
"mediaType": "application/vnd.oci.image.manifest.v1+json",
"size": 7143,
"digest": "sha256:e692418e4cbaf90ca69d05a66403747baa33ee08806650b51fab815ad7fc331f",
"platform": {
"architecture": "ppc64le",
"os": "linux"
}
},
{
"mediaType": "application/vnd.oci.image.manifest.v1+json",
"size": 7682,
"digest": "sha256:5b0bcabd1ed22e9fb1310cf6c2dec7cdef19f0ad69efa1f392e94a4333501270",
"platform": {
"architecture": "amd64",
"os": "linux",
"os.features": [
"sse4"
]
}
}
],
"annotations": {
"com.example.key1": "value1",
"com.example.key2": "value2"
}
}
OCI Image Layout 鏡像布局規(guī)范
OCI的鏡像布局是指內(nèi)容尋址(blobs)和位置尋址(refs)的目錄結(jié)構(gòu)告材。這個(gè)布局可以使用多種方式傳輸:歸檔文件如tar/zip坤次、共享文件系統(tǒng)環(huán)境如nfs、網(wǎng)絡(luò)傳輸如http/ftp/rsync等
鏡像布局有以下部分組成:
- blobs directory 內(nèi)容尋址的塊文件斥赋,目錄必須存在缰猴,但是可以為空。
- oci-layout file 文件必須存在疤剑、必須是JSON格式,文件中必須包含一個(gè)imageLayoutVersion字段文件中可以有其他字段作為擴(kuò)展使用
- index.json file 文件必須存在滑绒、必須是JSON格式,文件中必須包含鏡像Index的基本屬性
示例
$ cd example.com/app/
$ find . -type f
./index.json
./oci-layout
./blobs/sha256/3588d02542238316759cbf24502f4344ffcc8a60c803870022f335d1390c13b4
./blobs/sha256/4b0bc1c4050b03c95ef2a8e36e25feac42fd31283e8c30b3ee5df6b043155d3c
./blobs/sha256/7968321274dc6b6171697c33df7815310468e694ac5be0ec03ff053bb135e768
blob文件名命名是通過內(nèi)容計(jì)算的shasum
$ shasum -a 256 ./blobs/sha256/afff3924849e458c5ef237db5f89539274d5e609db5db935ed3959c90f1f2d51
afff3924849e458c5ef237db5f89539274d5e609db5db935ed3959c90f1f2d51 ./blobs/sha256/afff3924849e458c5ef237db5f89539274d5e609db5db935ed3959c90f1f2d51
Index.json 文件
index.json 文件相當(dāng)于整個(gè)鏡像的入口。從這個(gè)文件可以獲取整個(gè)鏡像依賴到的所有文件的信息隘膘。 每一個(gè)在manifests 字段中的 descriptor 都指向一個(gè) application/vnd.oci.image.index.v1+json 或 application/vnd.oci.image.manifest.v1+json 類型的文件疑故。
一個(gè)通用的做法,org.opencontainers.image.ref.name 注解被認(rèn)為是鏡像 Tag 的含義弯菊。表示鏡像的不同版本纵势。
index.json 示例
{
"schemaVersion": 2,
"manifests": [
{
"mediaType": "application/vnd.oci.image.index.v1+json",
"size": 7143,
"digest": "sha256:0228f90e926ba6b96e4f39cf294b2586d38fbb5a1e385c05cd1ee40ea54fe7fd",
"annotations": {
"org.opencontainers.image.ref.name": "stable-release"
}
},
{
"mediaType": "application/vnd.oci.image.manifest.v1+json",
"size": 7143,
"digest": "sha256:e692418e4cbaf90ca69d05a66403747baa33ee08806650b51fab815ad7fc331f",
"platform": {
"architecture": "ppc64le",
"os": "linux"
},
"annotations": {
"org.opencontainers.image.ref.name": "v1.0"
}
},
{
"mediaType": "application/xml",
"size": 7143,
"digest": "sha256:b3d63d132d21c3ff4c35a061adf23cf43da8ae054247e32faa95494d904a007e",
"annotations": {
"org.freedesktop.specifications.metainfo.version": "1.0",
"org.freedesktop.specifications.metainfo.type": "AppStream"
}
}
],
"annotations": {
"com.example.index.revision": "r124356"
}
}
OCI-layout 文件
在鏡像規(guī)范中,這個(gè)文件特別簡單管钳,只有一個(gè)布局版本的字段钦铁。
oci-layout 示例
{
"imageLayoutVersion": "1.0.0"
}
Blobs 文件夾
blobs文件夾下的子文件夾是以Hash算法的名稱來命名的,這些子文件夾下包含了真正的實(shí)體文件才漆。
一個(gè)塊被digest引用時(shí)(:牛曹,descriptor),這個(gè)塊必須存放在blobs/<alg>/<hex>目錄栽烂。
blobs文件夾下面可能會存放很多已經(jīng)沒有任何引用的塊文件躏仇。
blobs文件夾下可以缺失一些被引用的塊文件,只要被其他額外的塊填滿就可以了腺办。
Blobs 示例 Image Index
$ cat ./blobs/sha256/9b97579de92b1c195b85bb42a11011378ee549b02d7fe9c17bf2a6b35d5cb079 | jq
{
"schemaVersion": 2,
"manifests": [
{
"mediaType": "application/vnd.oci.image.manifest.v1+json",
"size": 7143,
"digest": "sha256:afff3924849e458c5ef237db5f89539274d5e609db5db935ed3959c90f1f2d51",
"platform": {
"architecture": "ppc64le",
"os": "linux"
}
},
...
Blobs 示例 Image Manifest
$ cat ./blobs/sha256/afff3924849e458c5ef237db5f89539274d5e609db5db935ed3959c90f1f2d51 | jq
{
"schemaVersion": 2,
"config": {
"mediaType": "application/vnd.oci.image.config.v1+json",
"size": 7023,
"digest": "sha256:5b0bcabd1ed22e9fb1310cf6c2dec7cdef19f0ad69efa1f392e94a4333501270"
},
"layers": [
{
"mediaType": "application/vnd.oci.image.layer.v1.tar+gzip",
"size": 32654,
"digest": "sha256:e692418e4cbaf90ca69d05a66403747baa33ee08806650b51fab815ad7fc331f"
},
...
Blobs 示例 Image Config
$ cat ./blobs/sha256/5b0bcabd1ed22e9fb1310cf6c2dec7cdef19f0ad69efa1f392e94a4333501270 | jq
{
"architecture": "amd64",
"author": "Alyssa P. Hacker <alyspdev@example.com>",
"config": {
"Hostname": "8dfe43d80430",
"Domainname": "",
"User": "",
"AttachStdin": false,
"AttachStdout": false,
"AttachStderr": false,
"Tty": false,
"OpenStdin": false,
"StdinOnce": false,
"Env": [
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
],
"Cmd": null,
"Image": "sha256:6986ae504bbf843512d680cc959484452034965db15f75ee8bdd1b107f61500b",
...
Image Layer Blob
$ cat ./blobs/sha256/e692418e4cbaf90ca69d05a66403747baa33ee08806650b51fab815ad7fc331f
[tar stream]
Image Layer Filesystem Changeset 鏡像層規(guī)范
如何序列化 文件系統(tǒng) 以及 文件系統(tǒng)的改變(如刪除文件) 到一個(gè) blob 文件稱之為" layer "焰手,由一個(gè)或多個(gè)layer層疊加構(gòu)成一個(gè)完整的文件系統(tǒng)。
Image Filesystem Changeset文件系統(tǒng)改變集
每一個(gè)layer都會有對它相對于父layer增怀喉、刪书妻、改的文件的一個(gè)存檔,使用諸如AUFS等聯(lián)合掛載文件系統(tǒng),可以將一系列的image layer以單一的文件系統(tǒng)的形式呈現(xiàn)出來躲履。
Change type 文件系統(tǒng)改變類型
Additions
Modifications
Removals
創(chuàng)建 Image Filesystem Changeset
-
創(chuàng)建根文件系統(tǒng)
根文件系統(tǒng)是基礎(chǔ)或父 layer , 此處初始為空目錄結(jié)構(gòu)见间,使用唯一的目錄名rootfs-c9d-v1
rootfs-c9d-v1/
- 創(chuàng)建初始文件與目錄
rootfs-c9d-v1/
etc/
my-app-config
bin/
my-app-binary
my-app-tools
? rootfs-c9d-v1 目錄會被作為以下文件的打包存檔的入口(tar)
./
./etc/
./etc/my-app-config
./bin/
./bin/my-app-binary
./bin/my-app-tools
-
復(fù)制或快照初始文件系統(tǒng)
以前面的根文件系統(tǒng)復(fù)制或快照,創(chuàng)建一個(gè)新的目錄和初始化文件系統(tǒng)工猜,目錄名為rootfs-c9d-v1.s1
rootfs-c9d-v1.s1/
etc/
my-app-config
bin/
my-app-binary
my-app-tools
增加一個(gè)./etc/my-app.d目錄包含default.cfg文件米诉,刪除存在的my-app-config文件。與此同時(shí)篷帅,改變./bin/my-app-tools二進(jìn)制文件內(nèi)容或?qū)傩浴?
rootfs-c9d-v1.s1/
etc/
my-app.d/
default.cfg
bin/
my-app-binary
my-app-tools
-
檢測變化和表示變化項(xiàng)
通過兩個(gè)目錄進(jìn)行比較("rootfs-c9d-v1" VS "rootfs-c9d-v1.s1")史侣,查詢文件是否有被增加、修改魏身、刪除操作
Added: /etc/my-app.d/
Added: /etc/my-app.d/default.cfg
Modified: /bin/my-app-tools
Deleted: /etc/my-app-config
- 創(chuàng)建 changeset 文件
打包 tar 文件僅包含 changeset :
- 增加與修改的文件和目錄完整打包
- 刪除的文件或目錄由whiteout文件(.wh.命名)來標(biāo)識
./etc/my-app.d/
./etc/my-app.d/default.cfg
./bin/my-app-tools
./etc/.wh.my-app-config
OCI Runtime Filesystem Bundle 運(yùn)行時(shí)文件系統(tǒng)包
OCI Image 可通過鏡像名稱發(fā)現(xiàn)惊橱、下載、hash值來驗(yàn)證箭昵、簽名受信以及解包成 OCI 運(yùn)行時(shí) Bundle税朴。一個(gè)標(biāo)準(zhǔn)的容器 bundle 包含容器加載和運(yùn)行所需的所有信息,其包含如下:
- config.json 容器配置數(shù)據(jù)文件家制,必須與文件系統(tǒng)同目錄下正林,文件名必須為config.json
- root filesystem 容器 root 文件系統(tǒng)(啟動的只讀文件),在 config.json 文件內(nèi)有指定 root.path慰丛。
config.json 配置文件說明
config樣例:
{
"ociVersion": "1.0.1",
"process": {
"terminal": true,
"user": {
"uid": 1,
"gid": 1,
"additionalGids": [
5,
6
]
},
"args": [
"sh"
],
"env": [
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
"TERM=xterm"
],
"cwd": "/",
"capabilities": {
"bounding": [
"CAP_AUDIT_WRITE",
"CAP_KILL",
"CAP_NET_BIND_SERVICE"
],
"permitted": [
"CAP_AUDIT_WRITE",
"CAP_KILL",
"CAP_NET_BIND_SERVICE"
],
"inheritable": [
"CAP_AUDIT_WRITE",
"CAP_KILL",
"CAP_NET_BIND_SERVICE"
],
"effective": [
"CAP_AUDIT_WRITE",
"CAP_KILL"
],
"ambient": [
"CAP_NET_BIND_SERVICE"
]
},
"rlimits": [
{
"type": "RLIMIT_CORE",
"hard": 1024,
"soft": 1024
},
{
"type": "RLIMIT_NOFILE",
"hard": 1024,
"soft": 1024
}
],
"apparmorProfile": "acme_secure_profile",
"oomScoreAdj": 100,
"selinuxLabel": "system_u:system_r:svirt_lxc_net_t:s0:c124,c675",
"noNewPrivileges": true
},
"root": {
"path": "rootfs",
"readonly": true
},
"hostname": "slartibartfast",
"mounts": [
{
"destination": "/proc",
"type": "proc",
"source": "proc"
},
{
"destination": "/dev",
"type": "tmpfs",
"source": "tmpfs",
"options": [
"nosuid",
"strictatime",
"mode=755",
"size=65536k"
]
},
{
"destination": "/dev/pts",
"type": "devpts",
"source": "devpts",
"options": [
"nosuid",
"noexec",
"newinstance",
"ptmxmode=0666",
"mode=0620",
"gid=5"
]
},
{
"destination": "/dev/shm",
"type": "tmpfs",
"source": "shm",
"options": [
"nosuid",
"noexec",
"nodev",
"mode=1777",
"size=65536k"
]
},
{
"destination": "/dev/mqueue",
"type": "mqueue",
"source": "mqueue",
"options": [
"nosuid",
"noexec",
"nodev"
]
},
{
"destination": "/sys",
"type": "sysfs",
"source": "sysfs",
"options": [
"nosuid",
"noexec",
"nodev"
]
},
{
"destination": "/sys/fs/cgroup",
"type": "cgroup",
"source": "cgroup",
"options": [
"nosuid",
"noexec",
"nodev",
"relatime",
"ro"
]
}
],
"hooks": {
"prestart": [
{
"path": "/usr/bin/fix-mounts",
"args": [
"fix-mounts",
"arg1",
"arg2"
],
"env": [
"key1=value1"
]
},
{
"path": "/usr/bin/setup-network"
}
],
"poststart": [
{
"path": "/usr/bin/notify-start",
"timeout": 5
}
],
"poststop": [
{
"path": "/usr/sbin/cleanup.sh",
"args": [
"cleanup.sh",
"-f"
]
}
]
},
"linux": {
"devices": [
{
"path": "/dev/fuse",
"type": "c",
"major": 10,
"minor": 229,
"fileMode": 438,
"uid": 0,
"gid": 0
},
{
"path": "/dev/sda",
"type": "b",
"major": 8,
"minor": 0,
"fileMode": 432,
"uid": 0,
"gid": 0
}
],
"uidMappings": [
{
"containerID": 0,
"hostID": 1000,
"size": 32000
}
],
"gidMappings": [
{
"containerID": 0,
"hostID": 1000,
"size": 32000
}
],
"sysctl": {
"net.ipv4.ip_forward": "1",
"net.core.somaxconn": "256"
},
"cgroupsPath": "/myRuntime/myContainer",
"resources": {
"network": {
"classID": 1048577,
"priorities": [
{
"name": "eth0",
"priority": 500
},
{
"name": "eth1",
"priority": 1000
}
]
},
"pids": {
"limit": 32771
},
"hugepageLimits": [
{
"pageSize": "2MB",
"limit": 9223372036854772000
},
{
"pageSize": "64KB",
"limit": 1000000
}
],
"memory": {
"limit": 536870912,
"reservation": 536870912,
"swap": 536870912,
"kernel": -1,
"kernelTCP": -1,
"swappiness": 0,
"disableOOMKiller": false
},
"cpu": {
"shares": 1024,
"quota": 1000000,
"period": 500000,
"realtimeRuntime": 950000,
"realtimePeriod": 1000000,
"cpus": "2-3",
"mems": "0-7"
},
"devices": [
{
"allow": false,
"access": "rwm"
},
{
"allow": true,
"type": "c",
"major": 10,
"minor": 229,
"access": "rw"
},
{
"allow": true,
"type": "b",
"major": 8,
"minor": 0,
"access": "r"
}
],
"blockIO": {
"weight": 10,
"leafWeight": 10,
"weightDevice": [
{
"major": 8,
"minor": 0,
"weight": 500,
"leafWeight": 300
},
{
"major": 8,
"minor": 16,
"weight": 500
}
],
"throttleReadBpsDevice": [
{
"major": 8,
"minor": 0,
"rate": 600
}
],
"throttleWriteIOPSDevice": [
{
"major": 8,
"minor": 16,
"rate": 300
}
]
}
},
"rootfsPropagation": "slave",
"seccomp": {
"defaultAction": "SCMP_ACT_ALLOW",
"architectures": [
"SCMP_ARCH_X86",
"SCMP_ARCH_X32"
],
"syscalls": [
{
"names": [
"getcwd",
"chmod"
],
"action": "SCMP_ACT_ERRNO"
}
]
},
"namespaces": [
{
"type": "pid"
},
{
"type": "network"
},
{
"type": "ipc"
},
{
"type": "uts"
},
{
"type": "mount"
},
{
"type": "user"
},
{
"type": "cgroup"
}
],
"maskedPaths": [
"/proc/kcore",
"/proc/latency_stats",
"/proc/timer_stats",
"/proc/sched_debug"
],
"readonlyPaths": [
"/proc/asound",
"/proc/bus",
"/proc/fs",
"/proc/irq",
"/proc/sys",
"/proc/sysrq-trigger"
],
"mountLabel": "system_u:object_r:svirt_sandbox_file_t:s0:c715,c811"
},
"annotations": {
"com.example.key1": "value1",
"com.example.key2": "value2"
}
}
~~ 本文 END ~~