a C library for accessing OCI runtime and image spec files
Go to file
Giuseppe Scrivano c84a85ba63
Merge pull request #161 from giuseppe/update-3-july-2025
image-spec, runtime-spec: update from upstream
2025-07-03 12:51:30 +02:00
.github/workflows
build-aux
image-spec@06e6b47e2e
runtime-spec@34a39b9070
src
tests
yajl@6bc5219389
.gitignore
.gitmodules
CODE-OF-CONDUCT.md
COPYING
Cargo.lock
Cargo.toml
GNUmakefile
Makefile.am
README.md
SECURITY.md
autogen.sh
cfg.mk
configure.ac
maint.mk
ocispec.pc.in
rust-gen.js

README.md

libocispec

Build Status

A library for easily parsing of OCI runtime and OCI image files from C, and generate json string from corresponding struct.

The parser is generated directly from the JSON schema in the source repository.

Installation

Expects yajl to be installed and linkable.

$ ./autogen.sh
$ ./configure
$ make
$ sudo make install

Parsing an OCI configuration file is easy as:

    #include <config.h>
    #include <runtime_spec_schema_config_schema.h>

    runtime_spec_schema_config_schema *container = runtime_spec_schema_config_schema_parse_file ("config.json", NULL, &err);

    if (container == NULL)
      exit (EXIT_FAILURE);

    /* Print the container hostname.  */
    if (container->hostname)
        printf ("The specified hostname is %s\n", container->hostname);

    for (size_t i; i < container->mounts_len; i++)
        printf ("Mounting to %s\n", container->mounts[i]->destination);

    printf ("Running as user ID and GID %d %d\n", container->process->user->uid, container->process->user->gid);

Generating an OCI configuration json string is also easy as:

    #include <config.h>
    #include <runtime_spec_schema_config_schema.h>

    runtime_spec_schema_config_schema container;
    char *json_buf = NULL;

    memset (&container, 0, sizeof (runtime_spec_schema_config_schema));

    container.oci_version = "2";
    container.hostname = "ubuntu";
    /* Add other configuration. */
    /* ... ... */

    json_buf = runtime_spec_schema_config_schema_generate_json (&container, NULL, &err);
    if (json_buf == NULL)
      exit (EXIT_FAILURE);

    printf ("The generated json string is:\n%s\n", json_buf);

Rust Bindings

libocispec supports rust bindings as well. You can use it directly by adding it as dependency to Cargo.toml or generate fresh types using make generate-rust

[dependencies]
libocispec = { git = "https://github.com/containers/libocispec" }

for Cargo version older than 0.51.0 specify branch explicitly

[dependencies]
libocispec = { git = "https://github.com/containers/libocispec", branch = "main" }

Example usage

extern crate libocispec;
use libocispec::runtime;
use libocispec::image;

fn main() {
    let runtime_spec = match runtime::Spec::load("path/to/spec") {
        Ok(spec) => spec,
        Err(e) => panic!("{}", e),
    }
    let image_spec = match image::ImageConfig::load("path/to/spec") {
        Ok(spec) => spec,
        Err(e) => panic!("{}", e),
    }
}