1. Blog
  2. Golang
  3. kubernetes
  4. Rust
  5. 关于作者

OCI practice

OCI practice

OCI create

参看 OCI 规范中,有指定 create 的命令行操作。oci create <container-id> <path-to-bundle>

bundle 准备

创建一个容器需要准备一个 bundle。可以借助docker export生成rootfs,借助runc spec生成 config.json

以创建 alpine bundle 为例:

mkdir bundle
cd bundle
docker pull alpine:3.12
docker export $(docker create alpine:3.12) > rootfs.tar
mkdir rootfs
tar -C rootfs -xf rootfs.tar
runc spec
ls -l

此外,除了使用runc spec,还可以使用 oci-runtime-tool generate命令生成config.json文件。参考runtime-tools

处理流程

应用 config.json

root

示例:

  "root": {
    "path": "rootfs",
    "readonly": true
  }

mounts

示例:

"mounts": [
    {
        "destination": "/tmp",
        "type": "tmpfs",
        "source": "tmpfs",
        "options": ["nosuid","strictatime","mode=755","size=65536k"]
    },
    {
        "destination": "/data",
        "type": "none",
        "source": "/volumes/testing",
        "options": ["rbind","rw"]
    }
]

hostname

示例:

"hostname": "fkghst"

hooks

createRuntime 必须在创建完成 namespace cgroups 等操作后,在 pivot_root 之前。该 hook 的路径解析和调用必须在运行时(主机)的 namespace 中。 CreateContainer 必须在创建完成 namespace cgroups 等操作后,在 pivot_root 之前。该 hook 的路径解析需要在运行时 namespace,而调用必须在容器的 namespace 中。 StartContainer 必须在 start 操作执行 exec 之前调用,该 hook 的路径解析需要在运行时 namespace,而调用必须在容器的 namespace 中。