Placeholder for OCI changes
runj supports a new freebsd
field in the config.json
that models
FreeBSD-specific configuration options for jails. The freebsd
field can also
be written to a runj-specific runj.ext.json
file in the bundle directory to
allow this functionality to be tested without modifying other tools.
Fields inside the freebsd
struct:
network
(struct)
Fields inside the network
struct:
ipv4
(struct)vnet
(struct)
Fields inside the ipv4
struct:
mode
(string) - valid options arenew
,inherit
, anddisable
. This field is the equivalent of theip4
field described in thejail(8)
manual page.addr
([]string) - list of IPv4 addresses assigned to the jail. This field is the equivalent of theip4.addr
field described in thejail(8)
manual page.
Fields inside the vnet
struct:
mode
(string) - valid options arenew
andinherit
. This field is the equivalent of thevnet
field described in thejail(8)
manual page.interfaces
([]string) - list of network interfaces assigned to the jail. This field is the equivalent of thevnet.interface
field described in thejail(8)
manual page.
If embedded in the normal config.json
, an example would look as follows:
{
"ociVersion": "1.0.2",
"process": {
// omitted
},
"freebsd": {
"network": {
"ipv4": {
"mode": "new",
"addr": ["127.0.0.2"]
},
"vnet": {
"mode": "new",
"interfaces": ["epair0b"]
}
}
}
}
If included in a separate runj.ext.json
, an example would look as follows:
{
"network": {
"ipv4": {
"mode": "inherit"
},
"vnet": {
"mode": "inherit"
}
}
}
The create
command is documented in the
spec
as requiring two positional arguments: <container-id> <path-to-bundle>
.
However, runc
(the reference implementation of the spec) accepts only a single
positional argument (<container-id>
) and instead uses either the current
working directory as the bundle or accepts it through the -b
/--bundle
flag.
See here.
For compatibility with runc and other integrations, runj now supports the flag
in addition to the positional argument form.
The spec does not describe how container STDIO should be handled. runc passes
the STDIO file descriptors for the runc create
invocation to the container
process. Programs that invoke runc (like containerd) configure STDIO for runc create
and provide input/collect output for the container through those
descriptors.
The spec includes a terminal
field, but does not describe how a runtime should
expose the terminal. runc expects an AF_UNIX
socket to be provided as a
command-line argument in the --console-socket
field; runc's init process is
responsible for allocating a pty
and sending the control device's file
descriptor over the provided socket.
runc opens the socket file as part of runc create
, then passes that socket
file as an extra file descriptor when starting the init process, indicating the
fd number with the _LIBCONTAINER_CONSOLE
environment variable. The init
process creates the pty (console.NewPty
), sends the control fd number to the
socket (utils.SendFd
), and uses dup3(2)
to override the standard I/O file
descriptors (0, 1, and 2) for the container process.
A runc client like containerd-shim-runc-v2
is responsible for creating the
socket passed as --console-socket
(with pkg/process/init.go:Create
),
receiving the control device (with socket.ReceiveMaster
), then copying bytes
to and from the device.
runc's implementation of the start command exits immediately after starting the container's process. This does not appear to be specified in the spec.