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 github: update action 2025-05-13 08:48:32 +02:00
build-aux build: add make syntax-check 2017-07-10 17:30:31 +02:00
image-spec@06e6b47e2e image-spec: update from upstream 2025-07-03 12:21:43 +02:00
runtime-spec@34a39b9070 runtime-spec: update from upstream 2025-07-03 12:22:02 +02:00
src sources.py: fix unconditional return in map value clone 2025-05-16 19:49:15 +02:00
tests generate: generate clone operations for deep-copy 2024-09-05 22:25:01 +02:00
yajl@6bc5219389 runtime-spec: use version v1.2.0 2024-03-01 10:38:54 -08:00
.gitignore Make libocispec installable 2022-10-16 23:22:33 -04:00
.gitmodules yajl: support static link of containers/yajl 2021-03-05 09:46:12 +01:00
CODE-OF-CONDUCT.md Code of Conduct 2020-02-08 23:48:14 +01:00
COPYING COPYING: add bison-like exception 2021-03-15 15:55:56 +01:00
Cargo.lock switch default type fields to public 2021-04-10 14:31:47 +05:30
Cargo.toml Add rust port for libocispec 2021-04-06 23:43:58 +05:30
GNUmakefile build: add make syntax-check 2017-07-10 17:30:31 +02:00
Makefile.am Makefile.am: distribute the src/yajl symlink 2024-05-07 12:00:10 +02:00
README.md Docs: update branch to main 2021-05-15 14:03:37 +05:30
SECURITY.md Add Security Policy 2020-05-11 14:17:21 -04:00
autogen.sh yajl: support static link of containers/yajl 2021-03-05 09:46:12 +01:00
cfg.mk parser: allocate empty arrays 2022-08-25 12:42:52 +02:00
configure.ac configure.ac: --enable-embedded-yajl skips check for yajl 2024-05-07 13:18:32 +02:00
maint.mk parser: allocate empty arrays 2022-08-25 12:42:52 +02:00
ocispec.pc.in Move header files under ocispec/ 2022-10-17 11:43:08 -04:00
rust-gen.js switch default type fields to public 2021-04-10 14:31:47 +05:30

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),
    }
}