crun

A fast and lightweight fully featured OCI runtime and C library for running containers

Github stars Tracking Chart

crun

Build Status
Coverity Status
Total alerts
Language grade: C/C++

A fast and low-memory footprint OCI Container Runtime fully written in C.

crun conforms to the OCI Container Runtime specifications
(https://github.com/opencontainers/runtime-spec).

Documentation

The user documentation is available here.

Static build

If you are looking for a static build, take a look at the instructions
here.

Why another implementation?

While most of the tools used in the Linux containers ecosystem are
written in Go, I believe C is a better fit for a lower level tool like
a container runtime. runc, the most used implementation of the OCI
runtime specs written in Go, re-execs itself and use a module written
in C for setting up the environment before the container process
starts.

crun aims to be also usable as a library that can be easily included
in programs without requiring an external process for managing OCI
containers.

Performance

crun is faster than runc and has a much lower memory footprint.

This is the elapsed time on my machine for running sequentially 100
containers, the containers run /bin/true:, crun, runc, %, -------------, -------------:, -----:, -----:, 100 /bin/true, 0:01.69, 0:3.34, -49.4%, crun requires fewer resources, so it is also possible to set stricter
limits on the memory and number of PIDs allowed in the container:

# podman --runtime /usr/bin/runc run --rm --pids-limit 1 fedora echo it works
Error: container_linux.go:346: starting container process caused "process_linux.go:319: getting the final child's pid from pipe caused \"EOF\"": OCI runtime error

# podman --runtime /usr/bin/crun run --rm --pids-limit 1 fedora echo it works
it works

# podman --runtime /usr/bin/runc run --rm --memory 4M fedora echo it works
Error: container_linux.go:346: starting container process caused "process_linux.go:327: getting pipe fds for pid 13859 caused \"readlink /proc/13859/fd/0: no such file or directory\"": OCI runtime command not found error

# podman --runtime /usr/bin/crun run --rm --memory 4M fedora echo it works
it works

crun could go much lower than that, and require < 1M. The used 4MB is
a hard limit set directly in Podman before calling the OCI runtime.

Build

On Fedora these dependencies are required for the build:

dnf install -y make python git gcc automake autoconf libcap-devel \
    systemd-devel yajl-devel libseccomp-devel \
    go-md2man glibc-static python3-libmount libtool

On RHEL/CentOS 8

yum --enablerepo='*' install -y make automake autoconf gettext \
    libtool gcc libcap-devel systemd-devel yajl-devel \
    libseccomp-devel python36 libtool

go-md2man is not available on RHEL/CentOS 8, so if you'd like to build
the man page, you also need to manually install go-md2man. It can be
installed with:

yum --enablerepo='*' install -y golang
export GOPATH=$HOME/go
go get github.com/cpuguy83/go-md2man
export PATH=$PATH:$GOPATH/bin

On Ubuntu:

apt-get install -y make git gcc build-essential pkgconf libtool \
   libsystemd-dev libcap-dev libseccomp-dev libyajl-dev \
   go-md2man libtool autoconf python3 automake

On Alpine

apk add gcc automake autoconf libtool gettext pkgconf git make musl-dev \
    python3 libcap-dev libseccomp-dev yajl-dev argp-standalone go-md2man

Unless you are also building the Python bindings, Python is needed
only by libocispec to generate the C parser at build time, it won't be
used afterwards.

Once all the dependencies are installed:

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

Main metrics

Overview
Name With Ownercontainers/crun
Primary LanguageC
Program languageMakefile (Language Count: 11)
Platform
License:GNU General Public License v2.0
所有者活动
Created At2017-09-13 20:20:58
Pushed At2025-04-24 21:22:20
Last Commit At
Release Count82
Last Release Name1.21 (Posted on 2025-03-28 09:11:27)
First Release Namev0.2 (Posted on 2019-01-19 14:00:35)
用户参与
Stargazers Count3.3k
Watchers Count52
Fork Count344
Commits Count3.7k
Has Issues Enabled
Issues Count533
Issue Open Count29
Pull Requests Count1120
Pull Requests Open Count2
Pull Requests Close Count63
项目设置
Has Wiki Enabled
Is Archived
Is Fork
Is Locked
Is Mirror
Is Private