OCI Image Spec 鏡像格式規(guī)范

概述

參考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)系圖

media-types.png

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):

  1. 內(nèi)容可尋址(通過 hash 算法為鏡像和它的組件生成唯一ID)

  2. 支持多種平臺的架構(gòu)鏡像(由一個(gè)更上層的 manifest 說明包含的鏡像 manifests 其具體平臺的版本情況)

  3. 能被解析成為 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等

鏡像布局有以下部分組成:

  1. blobs directory 內(nèi)容尋址的塊文件斥赋,目錄必須存在缰猴,但是可以為空。
  2. oci-layout file 文件必須存在疤剑、必須是JSON格式,文件中必須包含一個(gè)imageLayoutVersion字段文件中可以有其他字段作為擴(kuò)展使用
  3. 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

  1. 創(chuàng)建根文件系統(tǒng)

    根文件系統(tǒng)是基礎(chǔ)或父 layer , 此處初始為空目錄結(jié)構(gòu)见间,使用唯一的目錄名rootfs-c9d-v1

rootfs-c9d-v1/
  1. 創(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
  1. 復(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
  1. 檢測變化和表示變化項(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
  1. 創(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)行所需的所有信息,其包含如下:

  1. config.json 容器配置數(shù)據(jù)文件家制,必須與文件系統(tǒng)同目錄下正林,文件名必須為config.json
  2. 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 ~~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末卓囚,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子诅病,更是在濱河造成了極大的恐慌哪亿,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,718評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件贤笆,死亡現(xiàn)場離奇詭異蝇棉,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)芥永,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評論 3 385
  • 文/潘曉璐 我一進(jìn)店門篡殷,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人埋涧,你說我怎么就攤上這事板辽。” “怎么了棘催?”我有些...
    開封第一講書人閱讀 158,207評論 0 348
  • 文/不壞的土叔 我叫張陵劲弦,是天一觀的道長。 經(jīng)常有香客問我醇坝,道長邑跪,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,755評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮画畅,結(jié)果婚禮上砸琅,老公的妹妹穿的比我還像新娘。我一直安慰自己轴踱,他們只是感情好症脂,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,862評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著寇僧,像睡著了一般摊腋。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上嘁傀,一...
    開封第一講書人閱讀 50,050評論 1 291
  • 那天,我揣著相機(jī)與錄音视粮,去河邊找鬼细办。 笑死,一個(gè)胖子當(dāng)著我的面吹牛蕾殴,可吹牛的內(nèi)容都是我干的笑撞。 我是一名探鬼主播,決...
    沈念sama閱讀 39,136評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼钓觉,長吁一口氣:“原來是場噩夢啊……” “哼茴肥!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起荡灾,我...
    開封第一講書人閱讀 37,882評論 0 268
  • 序言:老撾萬榮一對情侶失蹤瓤狐,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后批幌,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體础锐,經(jīng)...
    沈念sama閱讀 44,330評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,651評論 2 327
  • 正文 我和宋清朗相戀三年荧缘,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了皆警。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,789評論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡截粗,死狀恐怖信姓,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情绸罗,我是刑警寧澤意推,帶...
    沈念sama閱讀 34,477評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站从诲,受9級特大地震影響左痢,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,135評論 3 317
  • 文/蒙蒙 一俊性、第九天 我趴在偏房一處隱蔽的房頂上張望略步。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,864評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至哼拔,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背羡铲。 一陣腳步聲響...
    開封第一講書人閱讀 32,099評論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留儡毕,地道東北人也切。 一個(gè)月前我還...
    沈念sama閱讀 46,598評論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像腰湾,于是被迫代替她去往敵國和親雷恃。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,697評論 2 351

推薦閱讀更多精彩內(nèi)容