Go to file
Michael Crosby fdb100d247 Destroy container along with processes before stdio
We need to make sure the container is destroyed before closing the stdio
for the container.  This becomes a big issues when running in the host's
pid namespace because the other processes could have inherited the stdio
of the initial process.  The call to close will just block as they still
have the io open.

Calling destroy before closing io, especially in the host pid namespace
will cause all additional processes to be killed in the container's
cgroup.  This will allow the io to be closed successfuly.

This change makes sure the order for destroy and close is correct as
well as ensuring that if any errors encoutered during start or exec will
be handled by terminating the process and destroying the container.  We
cannot use defers here because we need to enforce the correct ordering
on destroy.

This also sets the subreaper setting for runc so that when running in
pid host, runc can wait on the addiontal processes launched by the
container, useful on destroy, but also good for reaping the additional
processes that were launched.

Signed-off-by: Michael Crosby <crosbymichael@gmail.com>
2016-03-15 13:17:11 -07:00
Godeps Bump spec version to v0.4.0 2016-03-10 14:14:57 -08:00
libcontainer Destroy container along with processes before stdio 2016-03-15 13:17:11 -07:00
man Add README.md for generating man pages 2016-03-04 11:14:12 -08:00
script update go version to 1.5.3 in dockerfile and cleanup 2016-01-15 10:56:34 -08:00
tests Add the most basic sniff tests of runc 2016-03-07 11:01:31 -08:00
.gitignore Update .gitignore for generate man pages 2016-03-04 11:14:12 -08:00
CONTRIBUTING.md Move libcontainer documenation to root of repo 2015-06-26 11:50:46 -07:00
Dockerfile Add a Dockerfile and a dbuild target. This allows you to build runC via Docker without having Golang installed on the host 2015-12-18 11:37:12 +00:00
LICENSE Initial commit of runc binary 2015-06-21 19:34:13 -07:00
MAINTAINERS Add hqhq to MAINTAINER 2016-02-29 08:41:35 +08:00
MAINTAINERS_GUIDE.md Update maintainers guide 2015-07-21 10:59:56 -07:00
Makefile Add make uninstall command 2016-03-14 09:59:36 +08:00
NOTICE Move libcontainer documenation to root of repo 2015-06-26 11:50:46 -07:00
PRINCIPLES.md Move libcontainer documenation to root of repo 2015-06-26 11:50:46 -07:00
README.md Require containerd id as arg 1 2016-02-09 11:20:55 -08:00
checkpoint.go updating usage for runc and runc commands 2016-02-17 09:00:39 -06:00
delete.go updating usage for runc and runc commands 2016-02-17 09:00:39 -06:00
events.go Improve error handling in runc 2016-03-09 11:08:30 -08:00
exec.go Destroy container along with processes before stdio 2016-03-15 13:17:11 -07:00
kill.go updating usage for runc and runc commands 2016-02-17 09:00:39 -06:00
list.go Changing from logrus to fatal in list 2016-03-12 08:46:30 +05:30
main.go Add gitcommit to runc builds 2016-03-11 15:20:00 -08:00
main_unix.go Windows: Remove nsenter dependency 2015-06-28 17:04:16 -07:00
main_unsupported.go Improve error handling in runc 2016-03-09 11:08:30 -08:00
pause.go updating usage for runc and runc commands 2016-02-17 09:00:39 -06:00
restore.go Destroy container along with processes before stdio 2016-03-15 13:17:11 -07:00
rlimit_linux.go Adjust runc to new opencontainers/specs version 2015-09-15 08:35:25 -07:00
signals.go Destroy container along with processes before stdio 2016-03-15 13:17:11 -07:00
spec.go Update libcontainer to support rlimit per process 2016-03-10 14:35:16 -08:00
spec_test.go Update runc usage for new specs changes 2016-03-10 14:18:39 -08:00
start.go Destroy container along with processes before stdio 2016-03-15 13:17:11 -07:00
state.go Update runc usage for new specs changes 2016-03-10 14:18:39 -08:00
tty.go Wait for pipes to write all data before exit 2016-02-26 12:14:47 -08:00
utils.go Destroy container along with processes before stdio 2016-03-15 13:17:11 -07:00

README.md

[![Build Status](https://jenkins.dockerproject.org/buildStatus/icon?job=runc Master)](https://jenkins.dockerproject.org/job/runc Master)

runc

runc is a CLI tool for spawning and running containers according to the OCF specification.

State of the project

Currently runc is an implementation of the OCI specification. We are currently sprinting to have a v1 of the spec out. So the runc config format will be constantly changing until the spec is finalized. However, we encourage you to try out the tool and give feedback.

OCF

How does runc integrate with the Open Container Initiative Specification? runc depends on the types specified in the specs repository. Whenever the specification is updated and ready to be versioned runc will update its dependency on the specs repository and support the update spec.

Building:

At the time of writing, runc only builds on the Linux platform.

# create a 'github.com/opencontainers' in your GOPATH/src
cd github.com/opencontainers
git clone https://github.com/opencontainers/runc
cd runc
make
sudo make install

In order to enable seccomp support you will need to install libseccomp on your platform. If you do not with to build runc with seccomp support you can add BUILDTAGS="" when running make.

Build Tags

runc supports optional build tags for compiling in support for various features.

Build Tag Feature Dependency
seccomp Syscall filtering libseccomp
selinux selinux process and mount labeling
apparmor apparmor profile support libapparmor

Testing:

You can run tests for runC by using command:

# make test

Note that test cases are run in Docker container, so you need to install docker first. And test requires mounting cgroups inside container, it's done by docker now, so you need a docker version newer than 1.8.0-rc2.

You can also run specific test cases by:

# make test TESTFLAGS="-run=SomeTestFunction"

Using:

To run a container with the id "test", execute runc start with the containers id as arg one in the bundle's root directory:

runc start test
/ $ ps
PID   USER     COMMAND
1     daemon   sh
5     daemon   sh
/ $

OCI Container JSON Format:

OCI container JSON format is based on OCI specs. You can generate JSON files by using runc spec. It assumes that the file-system is found in a directory called rootfs and there is a user with uid and gid of 0 defined within that file-system.

Examples:

Using a Docker image (requires version 1.3 or later)

To test using Docker's busybox image follow these steps:

  • Install docker and download the busybox image: docker pull busybox
  • Create a container from that image and export its contents to a tar file: docker export $(docker create busybox) > busybox.tar
  • Untar the contents to create your filesystem directory:
mkdir rootfs
tar -C rootfs -xf busybox.tar
  • Create config.json by using runc spec.
  • Execute runc start and you should be placed into a shell where you can run ps:
$ runc start test
/ # ps
PID   USER     COMMAND
    1 root     sh
    9 root     ps

Using runc with systemd

To use runc with systemd, you can create a unit file /usr/lib/systemd/system/minecraft.service as below (edit your own Description or WorkingDirectory or service name as you need).

[Unit]
Description=Minecraft Build Server
Documentation=http://minecraft.net
After=network.target

[Service]
CPUQuota=200%
MemoryLimit=1536M
ExecStart=/usr/local/bin/runc start minecraft
Restart=on-failure
WorkingDirectory=/containers/minecraftbuild

[Install]
WantedBy=multi-user.target

Make sure you have the bundle's root directory and JSON configs in your WorkingDirectory, then use systemd commands to start the service:

systemctl daemon-reload
systemctl start minecraft.service

Note that if you use JSON configs by runc spec, you need to modify config.json and change process.terminal to false so runc won't create tty, because we can't set terminal from the stdin when using systemd service.