Giter Club home page Giter Club logo

railcar's Introduction

railcar - rust implementation of the oci-runtime spec

railcar

What is railcar?

railcar is a rust implementation of the opencontainers initiative's runtime spec. It is similar to the reference implementation runc, but it is implemented completely in rust for memory safety without needing the overhead of a garbage collector or multiple threads. For more information on the development of railcar, check out Building a Container Runtime in Rust

Building railcar

wercker status

Install rust:

curl https://sh.rustup.rs -sSf | sh
cargo install cargo-when
rustup toolchain install stable-x86_64-unknown-linux-gnu
rustup default stable-x86_64-unknown-linux-gnu # for stable
rustup target install x86_64-unknown-linux-musl # for stable
rustup toolchain install nightly-x86_64-unknown-linux-gnu
rustup default nightly-x86_64-unknown-linux-gnu # for nightly
rustup target install x86_64-unknown-linux-musl # for nightly

Building can be done via build.sh:

build.sh

By default, build.sh builds a dynamic binary using gnu. To build a static binary, set TARGET to x86_64-unknown-linux-musl:

TARGET=x86_64-unknown-linux-musl ./build.sh

Build requirements for TARGET=x86_64-unknown-linux-gnu:

libseccomp-devel

Build requirements for TARGET=x86_64-unknown-linux-musl:

git submodule update --init
autotools
make
gcc
musl-gcc

To build a release version:

build.sh --release

If you build using stable instead of nightly, the set_name feature will be disabled and the init process inside the container will not be named rc-init when viewed via ps or /proc/$pid/cmdline.

Using railcar

./railcar run

You can specify a different bundle directory where your config.json is located with -b:

./railcar -b /some/other/directory run

Using railcar with docker

railcar can be used as a backend for docker. To use it, start the docker daemon with an additional backend:

dockerd ... --experimental --add-runtime "rc=/path/to/railcar"

Then you can use railcar by specifying the rc backend:

docker run -it --rm --runtime rc hello

Note that you should start the daemon with a terminal (the -t option) so that docker can properly collect stdout and stderr from railcar. If you want to daemonize the container, just use:

docker run -dt --rm --runtime rc hello

Differences from runc

In general, railcar is very similar to runc, but some of the runc commands are not supported. Currently, railcar does not support the following commands:

 checkpoint
 events
 exec
 init
 list
 pause
 restore
 resume
 spec

Also, railcar always runs an init process separately from the container process.

Contributing

railcar is an open source project. See CONTRIBUTING for details.

Oracle gratefully acknowledges the contributions to railcar that have been made by the community.

Getting in touch

The best way to get in touch is Slack.

Click here to join the the Oracle Container Tools workspace.

Then join the Railcar channel.

License

Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved.

railcar is dual licensed under the Universal Permissive License 1.0 and the Apache License 2.0.

See LICENSE for more details.

railcar's People

Contributors

brunoborges avatar cholcombe973 avatar crush-157 avatar drahnr avatar mskarbek avatar nicodemus26 avatar sineaggi avatar termie avatar vishvananda avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

railcar's Issues

Can this work with podman?

The readme mentions using this with docker, I'm curious if it can be used with podman in the same way?

Compilation produces 'mismatched types' error on newer kernel

Attempted to build on Intel Clear Linux with the Rust nightly compiler and got the following error:

error[E0308]: mismatched types
  --> src/nix_ext.rs:50:40
   |
50 |     let res = unsafe { libc::setrlimit(resource, rlim) };
   |                                        ^^^^^^^^ expected u32, found i32

rustc and kernel version:

tim@thinkclear~/dev/rust/railcar $ rustc --version
rustc 1.35.0 (3c235d560 2019-05-20)
tim@thinkclear~/dev/rust/railcar $ uname -a
Linux thinkclear 5.1.12-785.native #1 SMP Wed Jun 19 07:09:10 UTC 2019 x86_64 GNU/Linux

I was able to get it built with this patch but I do not know if it's generally applicable, or if I have fully tested that my binary built with this change actually works.

Clear Build Instructions

Hi there,

First off thanks. This project is interesting. But at the same time it is unbuildable.

I understand this project is new and is in the process of gaining traction. However, the first thing anyone looking at experimental projects does is to go through the README and INSTALL file to understand how to build it. I faced the following issues whilst following the instructions in README (using both nightly and stable results in failure to build).

% cargo install cargo-when --force
    Updating crates.io index
  Installing cargo-when v0.1.0
   Compiling libc v0.2.58
   Compiling bitflags v1.1.0
   Compiling unicode-width v0.1.5
   Compiling strsim v0.8.0
   Compiling ansi_term v0.11.0
   Compiling vec_map v0.8.1
   Compiling nom v1.2.4
   Compiling textwrap v0.11.0
   Compiling atty v0.2.11
   Compiling semver v0.2.3
   Compiling clap v2.33.0
   Compiling cargo-when v0.1.0
    Finished release [optimized] target(s) in 14.13s
   Replacing /home/borats/.cargo/bin/cargo-when
    Replaced package `cargo-when v0.1.0` with `cargo-when v0.1.0` (executable `cargo-when`)
% rustup toolchain install nightly-x86_64-unknown-linux-gnu
info: syncing channel updates for 'nightly-x86_64-unknown-linux-gnu'

  nightly-x86_64-unknown-linux-gnu unchanged - rustc 1.37.0-nightly (8aa42ed7c 2019-06-24)

info: checking for self-updates
% rustup default nightly-x86_64-unknown-linux-gnu
info: using existing install for 'nightly-x86_64-unknown-linux-gnu'
info: default toolchain set to 'nightly-x86_64-unknown-linux-gnu'

  nightly-x86_64-unknown-linux-gnu unchanged - rustc 1.37.0-nightly (8aa42ed7c 2019-06-24)

% rustup target install x86_64-unknown-linux-musl
info: component 'rust-std' for target 'x86_64-unknown-linux-musl' is up to date
% ./build.sh
       Fresh autocfg v0.1.4
       Fresh cc v1.0.37
       Fresh unicode-xid v0.0.4
       Fresh quote v0.3.15
       Fresh serde v0.9.15
       Fresh cfg-if v0.1.9
       Fresh void v1.0.2
       Fresh dtoa v0.4.4
       Fresh itoa v0.3.4
       Fresh unicode-width v0.1.5
       Fresh rustc-demangle v0.1.15
       Fresh error-chain v0.11.0
       Fresh vec_map v0.8.1
       Fresh ansi_term v0.11.0
       Fresh strsim v0.8.0
       Fresh scopeguard v0.3.3
       Fresh lazy_static v1.3.0
       Fresh synom v0.11.3
       Fresh log v0.4.6
       Fresh textwrap v0.11.0
   Compiling railcar v1.0.4 (/home/borats/railcar)
       Fresh libc v0.2.58
       Fresh syn v0.11.11
       Fresh bitflags v1.1.0
     Running `/home/borats/railcar/target/debug/build/railcar-97580fb017f47a4c/build-script-build`
       Fresh num-traits v0.2.8
       Fresh backtrace-sys v0.1.28
       Fresh serde_codegen_internals v0.14.2
       Fresh nix v0.14.1
       Fresh atty v0.2.11
       Fresh errno v0.2.4
       Fresh nix v0.11.1
       Fresh seccomp-sys v0.1.2
       Fresh num-traits v0.1.43
       Fresh serde_derive v0.9.15
       Fresh backtrace v0.3.31
       Fresh caps v0.2.0
       Fresh prctl v1.0.0
       Fresh clap v2.33.0
       Fresh serde_json v0.9.10
       Fresh error-chain v0.10.0
       Fresh oci v0.1.0 (/home/borats/railcar/oci)
     Running `rustc --crate-name railcar src/main.rs --color always --crate-type bin --emit=dep-info,link -C debuginfo=2 --cfg 'feature="nightly"' -C metadata=12d0de802f07e3fd -C extra-filename=-12d0de802f07e3fd --out-dir /home/borats/railcar/target/x86_64-unknown-linux-gnu/debug/deps --target x86_64-unknown-linux-gnu -C incremental=/home/borats/railcar/target/x86_64-unknown-linux-gnu/debug/incremental -L dependency=/home/borats/railcar/target/x86_64-unknown-linux-gnu/debug/deps -L dependency=/home/borats/railcar/target/debug/deps --extern caps=/home/borats/railcar/target/x86_64-unknown-linux-gnu/debug/deps/libcaps-67d173d58ebaebb3.rlib --extern clap=/home/borats/railcar/target/x86_64-unknown-linux-gnu/debug/deps/libclap-eb82d8d1deb68ea9.rlib --extern error_chain=/home/borats/railcar/target/x86_64-unknown-linux-gnu/debug/deps/liberror_chain-750966dd47db576b.rlib --extern lazy_static=/home/borats/railcar/target/x86_64-unknown-linux-gnu/debug/deps/liblazy_static-f8ceff266b2f605c.rlib --extern libc=/home/borats/railcar/target/x86_64-unknown-linux-gnu/debug/deps/liblibc-ec4a4f7dac2918e1.rlib --extern log=/home/borats/railcar/target/x86_64-unknown-linux-gnu/debug/deps/liblog-fd8c27578fe85362.rlib --extern nix=/home/borats/railcar/target/x86_64-unknown-linux-gnu/debug/deps/libnix-1c93976f2ea74ddf.rlib --extern num_traits=/home/borats/railcar/target/x86_64-unknown-linux-gnu/debug/deps/libnum_traits-b589b2077b20211c.rlib --extern oci=/home/borats/railcar/target/x86_64-unknown-linux-gnu/debug/deps/liboci-22f042852e491cad.rlib --extern prctl=/home/borats/railcar/target/x86_64-unknown-linux-gnu/debug/deps/libprctl-eff9f095377cf6ec.rlib --extern scopeguard=/home/borats/railcar/target/x86_64-unknown-linux-gnu/debug/deps/libscopeguard-4169729df20e381e.rlib --extern seccomp_sys=/home/borats/railcar/target/x86_64-unknown-linux-gnu/debug/deps/libseccomp_sys-c808e7f6ba5ce040.rlib -L native=/home/borats/railcar/target/x86_64-unknown-linux-gnu/debug/build/backtrace-sys-7891320c1b99be3c/out`
error[E0463]: can't find crate for `alloc_system`
 --> src/main.rs:6:1
  |
6 | extern crate alloc_system;
  | ^^^^^^^^^^^^^^^^^^^^^^^^^^ can't find crate

error: aborting due to previous error

For more information about this error, try `rustc --explain E0463`.
error: Could not compile `railcar`.

Caused by:
  process didn't exit successfully: `rustc --crate-name railcar src/main.rs --color always --crate-type bin --emit=dep-info,link -C debuginfo=2 --cfg 'feature="nightly"' -C metadata=12d0de802f07e3fd -C extra-filename=-12d0de802f07e3fd --out-dir /home/borats/railcar/target/x86_64-unknown-linux-gnu/debug/deps --target x86_64-unknown-linux-gnu -C incremental=/home/borats/railcar/target/x86_64-unknown-linux-gnu/debug/incremental -L dependency=/home/borats/railcar/target/x86_64-unknown-linux-gnu/debug/deps -L dependency=/home/borats/railcar/target/debug/deps --extern caps=/home/borats/railcar/target/x86_64-unknown-linux-gnu/debug/deps/libcaps-67d173d58ebaebb3.rlib --extern clap=/home/borats/railcar/target/x86_64-unknown-linux-gnu/debug/deps/libclap-eb82d8d1deb68ea9.rlib --extern error_chain=/home/borats/railcar/target/x86_64-unknown-linux-gnu/debug/deps/liberror_chain-750966dd47db576b.rlib --extern lazy_static=/home/borats/railcar/target/x86_64-unknown-linux-gnu/debug/deps/liblazy_static-f8ceff266b2f605c.rlib --extern libc=/home/borats/railcar/target/x86_64-unknown-linux-gnu/debug/deps/liblibc-ec4a4f7dac2918e1.rlib --extern log=/home/borats/railcar/target/x86_64-unknown-linux-gnu/debug/deps/liblog-fd8c27578fe85362.rlib --extern nix=/home/borats/railcar/target/x86_64-unknown-linux-gnu/debug/deps/libnix-1c93976f2ea74ddf.rlib --extern num_traits=/home/borats/railcar/target/x86_64-unknown-linux-gnu/debug/deps/libnum_traits-b589b2077b20211c.rlib --extern oci=/home/borats/railcar/target/x86_64-unknown-linux-gnu/debug/deps/liboci-22f042852e491cad.rlib --extern prctl=/home/borats/railcar/target/x86_64-unknown-linux-gnu/debug/deps/libprctl-eff9f095377cf6ec.rlib --extern scopeguard=/home/borats/railcar/target/x86_64-unknown-linux-gnu/debug/deps/libscopeguard-4169729df20e381e.rlib --extern seccomp_sys=/home/borats/railcar/target/x86_64-unknown-linux-gnu/debug/deps/libseccomp_sys-c808e7f6ba5ce040.rlib -L native=/home/borats/railcar/target/x86_64-unknown-linux-gnu/debug/build/backtrace-sys-7891320c1b99be3c/out` (exit code: 1)
cp: cannot stat 'target/x86_64-unknown-linux-gnu/debug/railcar': No such file or directory

Any chance you could provide an up-to date README? Thanks

Unable to build on armv7 device

I'm entirely unfamiliar with Rust (!) but was intrigued to try building railcar on an armv7 device.

If I'm headed down a dead-end, please let me know.

During the build, I'm encountering 2 errors:

  • CAPGET|CAPSET not found in caps-rs: lucab/caps-rs#2
  • incorrect u_longlong with libc (!?) on armv7 (below)
error[E0308]: mismatched types
  --> src/nix_ext.rs:46:19
   |
46 |         rlim_cur: soft,
   |                   ^^^^ expected u32, found u64
   |
   = help: here are some functions which might fulfill your needs:
           - .count_ones()
           - .count_zeros()
           - .leading_zeros()
           - .trailing_zeros()

error[E0308]: mismatched types
  --> src/nix_ext.rs:47:19
   |
47 |         rlim_max: hard,
   |                   ^^^^ expected u32, found u64
   |
   = help: here are some functions which might fulfill your needs:
           - .count_ones()
           - .count_zeros()
           - .leading_zeros()
           - .trailing_zeros()

error: aborting due to 2 previous errors

error: Could not compile `railcar`.

This second issue may be a consequence of (my solution to) the first? The armv7 is 32-bit not 64-bit and, IIUC, libc:c_ulonglong is (defaulting) to 64-bit

nix_ext.rs:

#[inline]
pub fn setrlimit(
    resource: libc::c_int,
    soft: libc::c_ulonglong,
    hard: libc::c_ulonglong,
) -> Result<()> {
    let rlim = &libc::rlimit {
        rlim_cur: soft,
        rlim_max: hard,
    };
    let res = unsafe { libc::setrlimit(resource, rlim) };
    Errno::result(res).map(drop)
}

Installation

curl https://sh.rustup.rs -sSf | sh
cargo install cargo-when
rustup toolchain install stable-armv7-unknown-linux-gnueabihf
rustup default stable-armv7-unknown-linux-gnueabihf
git clone https://github.com/oracle/railcar.git
cd railcar
TARGET=armv7-unknown-linux-gnueabihf ./build.sh

Configuration

cargo --version
cargo 0.19.0 (28d1d60d4 2017-05-16)
lsb_release -a
No LSB modules are available.
Distributor ID:	Debian
Description:	Debian GNU/Linux 8.8 (jessie)
Release:	8.8
Codename:	jessie
rustc --version
rustc 1.18.0 (03fc9d622 2017-06-06)

Aside:
I tried using armv7-unknown-linux-musleabihf but realize that target is effectively not available

unable to start container

#docker run -d --runtime rc busybox top
677dbdda10bab368e63fc641c96d1367230294170d2cb930e8030c985a469c9d
docker: Error response from daemon: containerd: container not started.

#docker logs 677dbdda10bab368e63fc641c96d1367230294170d2cb930e8030c985a469c9d [8/1875]
ERROR - failed to load config.json
ERROR - caused by: invalid type: map, expected a sequence at line 1 column 304
ERROR - caused by: invalid type: map, expected a sequence at line 1 column 304
ERROR - stack backtrace:
0: 0x7fc7d8535d14 - backtrace::backtrace::libunwind::trace
at /root/.cargo/registry/src/github.com-1ecc6299db9ec823/backtrace-0.3.2/src/backtrace/libunwind.rs:53
- backtrace::backtrace::trace
at /root/.cargo/registry/src/github.com-1ecc6299db9ec823/backtrace-0.3.2/src/backtrace/mod.rs:42
1: 0x7fc7d85360ce - backtrace::capture::{{impl}}::new
at /root/.cargo/registry/src/github.com-1ecc6299db9ec823/backtrace-0.3.2/src/capture.rs:64
2: 0x7fc7d852bc2c - error_chain::make_backtrace
at /root/.cargo/registry/src/github.com-1ecc6299db9ec823/error-chain-0.10.0/src/lib.rs:417
3: 0x7fc7d847dedc - core::ops::FnOnce::call_once<fn() -> core::option::Option<alloc::arc::Arcbacktrace::capture::Backtrace>,()>
at /checkout/src/libcore/ops.rs:2626
4: 0x7fc7d8443f88 - core::option::{{impl}}::or_else<alloc::arc::Arcbacktrace::capture::Backtrace,fn() -> core::option::Option<alloc::arc::Arcbacktrace::capture::Backtrace>>
at /checkout/src/libcore/option.rs:640
5: 0x7fc7d843a17f - error_chain::{{impl}}::newrailcar::errors::Error
at /root/.cargo/registry/src/github.com-1ecc6299db9ec823/error-chain-0.10.0/src/lib.rs:518
6: 0x7fc7d8516275 - railcar::errors::{{impl}}::chain_err::{{closure}}oci::Spec,oci::serialize::SerializeError,closure,collections::string::String
at /home/shenling.yyb/code/railcar/<error_chain_processed macros>:131
7: 0x7fc7d846a4c6 - core::result::{{impl}}::map_erroci::Spec,oci::serialize::SerializeError,railcar::errors::Error,closure
at /checkout/src/libcore/result.rs:486
8: 0x7fc7d850a4f5 - railcar::errors::{{impl}}::chain_erroci::Spec,oci::serialize::SerializeError,closure,collections::string::String
at /home/shenling.yyb/code/railcar/<error_chain_processed macros>:129
9: 0x7fc7d84ea771 - railcar::cmd_create
at /home/shenling.yyb/code/railcar/src/main.rs:379
10: 0x7fc7d84e7ee2 - railcar::run
at /home/shenling.yyb/code/railcar/src/main.rs:294
11: 0x7fc7d84e6582 - railcar::main
at /home/shenling.yyb/code/railcar/src/main.rs:213
12: 0x7fc7d8806aaa - panic_unwind::__rust_maybe_catch_panic
at /checkout/src/libpanic_unwind/lib.rs:98
13: 0x7fc7d88003cd - std::panicking::try<(),fn()>
at /checkout/src/libstd/panicking.rs:433
- std::panic::catch_unwind<fn(),()>
at /checkout/src/libstd/panic.rs:361
- std::rt::lang_start
at /checkout/src/libstd/rt.rs:57
14: 0x7fc7d8519fb2 - main
15: 0x7fc7d7850b14 - __libc_start_main
16: 0x7fc7d8431eac -
17: 0x0 -

#./railcar --version
./railcar version: 0.1.0

build from git branch v1.0.0:
#git status
On branch v1.0.0

init

Also, railcar always runs an init process separately from the container process.

Does that mean that we'll have two init processes, when the container comes with one?

Library

Can OCI containers be spawned using railcar as a rust library?

seccomp error: failed to add rule for 135

I tried to run the OCI runtime validation tests and I've got this error:

$ sudo RUNTIME=/home/alban/git/railcar/railcar strace -f -s 512  validation/default.t
ERROR - seccomp error: 'failed to add rule for 135'
ERROR - stack backtrace:
   0:     0x560ff0b728f4 - backtrace::backtrace::libunwind::trace::hc45549482cbb1af4
                        at /home/alban/.cargo/registry/src/github.com-1ecc6299db9ec823/backtrace-0.3.5/src/backtrace/libunwind.rs:53
                         - backtrace::backtrace::trace::h67495f0a5e257230
                        at /home/alban/.cargo/registry/src/github.com-1ecc6299db9ec823/backtrace-0.3.5/src/backtrace/mod.rs:42
   1:     0x560ff0b6944c - backtrace::capture::Backtrace::new_unresolved::h7c0909f16975c7ed
                        at /home/alban/.cargo/registry/src/github.com-1ecc6299db9ec823/backtrace-0.3.5/src/capture.rs:88
   2:     0x560ff0b6939e - backtrace::capture::Backtrace::new::h81d3fd7bfe948d65
                        at /home/alban/.cargo/registry/src/github.com-1ecc6299db9ec823/backtrace-0.3.5/src/capture.rs:63
   3:     0x560ff0b511a2 - error_chain::make_backtrace::h31592abf2ad8bbb1
                        at /home/alban/.cargo/registry/src/github.com-1ecc6299db9ec823/error-chain-0.10.0/src/lib.rs:417
   4:     0x560ff0b5123f - <error_chain::State as core::default::Default>::default::h63520179be125c9a
                        at /home/alban/.cargo/registry/src/github.com-1ecc6299db9ec823/error-chain-0.10.0/src/lib.rs:504
   5:     0x560ff0a5712d - railcar::errors::Error::from_kind::h290f73054aec5f46
                        at /home/alban/git/railcar/<error_chain_processed macros>:52
   6:     0x560ff0a57567 - <railcar::errors::Error as core::convert::From<railcar::errors::ErrorKind>>::from::h04d5c4a374e144e8
                        at src/errors.rs:1
   7:     0x560ff0a58f77 - <T as core::convert::Into<U>>::into::hf93b14da50587807
                        at /builddir/build/BUILD/rustc-1.24.0-src/src/libcore/convert.rs:415
   8:     0x560ff0a6560a - railcar::seccomp::rule_add::h2580de477e336deb
                        at src/seccomp.rs:60
   9:     0x560ff0a66513 - railcar::seccomp::initialize_seccomp::h38e6ce8b17066776
                        at src/seccomp.rs:122
  10:     0x560ff0b20ca2 - railcar::run_container::h8f0d4093dbd38995
                        at src/main.rs:1311
  11:     0x560ff0b1c8d4 - railcar::safe_run_container::hd3d1aa7d25f8c9f8
                        at src/main.rs:1031
  12:     0x560ff0b0eef0 - railcar::finish_create::hde9faab9ba7307d4
                        at src/main.rs:618
  13:     0x560ff0b0cac5 - railcar::cmd_create::h54fdb4e81f5af2d0
                        at src/main.rs:533
  14:     0x560ff0b09fcd - railcar::run::ha775d7656c587058
                        at src/main.rs:410
  15:     0x560ff0b07a95 - railcar::main::h84535c10a40345aa
                        at src/main.rs:202
  16:     0x560ff0aa6fe1 - std::rt::lang_start::{{closure}}::h6f7b7051cc182dc6
                        at /builddir/build/BUILD/rustc-1.24.0-src/src/libstd/rt.rs:74
  17:     0x560ff0f623d7 - std::panicking::try::do_call::h2b4dea630c5a266b
  18:     0x560ff0f7bd4e - __rust_maybe_catch_panic
  19:     0x560ff0f67516 - std::rt::lang_start_internal::h59d916208fcf906e
  20:     0x560ff0aa6fc1 - std::rt::lang_start::h241bc6a443750730
                        at /builddir/build/BUILD/rustc-1.24.0-src/src/libstd/rt.rs:74
  21:     0x560ff0b2da0d - main
  22:     0x7f261c7fc009 - <unknown>
  23:     0x560ff0a1cc09 - _start
  24:                0x0 - <unknown>

(the error was not directly printed, I recovered it from the strace output)

Unable to use rc as runtime for docker : run command hangs indefinitely.

Steps performed :

  1. compile and build railcar. rc is an alias.
$ rc -V
Railcar 1.0.4
  1. added railcar as runtime for docker
 $ cat work/src/scripts/do_run_dockerd.sh 
sudo /usr/bin/dockerd --debug --log-level debug --data-root /home/rgade/docker-data-root --exec-root /home/rgade/docker-exec-root  --pidfile /home/rgade/docker.pid  --experimental --add-runtime "rc=/home/rgade/railcar/railcar" -H unix:///home/rgade/docker.sock -H tcp://0.0.0.0:2375
  1. Started docker daemon
    log is listed below.

  2. tried to run two containers, one as daemon , one with command

  • This one hung indedinitely.
    $ docker run -dt --rm --runtime rc nginx
    d3a1605e166db1bc66307b44ced44b1f25b98621b08b4ead59888314bdcd57e7

  • This one ended with Error response after a while.
    $ docker run -d --runtime rc busybox top
    ef6b37f13ff4b30d88484f43606d4f3f910a0a8701ef2c7a25ad98dcb460c95c
    docker: Error response from daemon: ttrpc: client shutting down: EOF: unknown.

docker ps -a output

 $ docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
ef6b37f13ff4        busybox             "top"                    25 minutes ago      Created                                 boring_wiles
d3a1605e166d        nginx               "nginx -g 'daemon ofโ€ฆ"   27 minutes ago      Created                                 nostalgic_hugle

docker version

$ docker version
Client:
Version: 18.01.0-ce
API version: 1.35
Go version: go1.9.2
Git commit: 03596f51b1
Built: Sun Jan 14 23:10:39 2018
OS/Arch: linux/amd64
Experimental: false
Orchestrator: swarm

Server:
Engine:
Version: 18.01.0-ce
API version: 1.35 (minimum version 1.12)
Go version: go1.9.2
Git commit: 03596f51b1
Built: Sun Jan 14 23:11:14 2018
OS/Arch: linux/amd64
Experimental: true

what I couldn't find.

  1. Log of railcar when run as docker backed. One of my query is whether this is implemented or not ( logging of railcar when used as backed for docker ).
    did try this though :
sudo /usr/bin/dockerd --debug --log-level debug --data-root /home/rgade/docker-data-root --exec-root /home/rgade/docker-exec-root  --pidfile /home/rgade/docker.pid  --experimental --add-runtime "rc=/home/rgade/railcar/railcar -v --log /home/rgade/rc.log " -H unix:///home/rgade/docker.sock -H tcp://0.0.0.0:2375

Didn't work, of course. Not really sure if that is the way!

Couldn't get logs for railcar run -v --log <filename> <subcommand> as well.
Couldn't see accessing logfile in code. Saw your PR #30 for 17.12 changes but does it also write to log file after touch ing it?

Log when run command was executed for nginx

time="2018-01-23T12:56:15.967017788+05:30" level=debug msg="Calling POST /v1.35/containers/create"
time="2018-01-23T12:56:15.967337209+05:30" level=debug msg="form data: {"AttachStderr":false,"AttachStdin":false,"AttachStdout":false,"Cmd":null,"Domainname":"","Entrypoint":null,"Env":[],"HostConfig":{"AutoRemove":true,"Binds":null,"BlkioDeviceReadBps":null,"BlkioDeviceReadIOps":null,"BlkioDeviceWriteBps":null,"BlkioDeviceWriteIOps":null,"BlkioWeight":0,"BlkioWeightDevice":[],"CapAdd":null,"CapDrop":null,"Cgroup":"","CgroupParent":"","ConsoleSize":[0,0],"ContainerIDFile":"","CpuCount":0,"CpuPercent":0,"CpuPeriod":0,"CpuQuota":0,"CpuRealtimePeriod":0,"CpuRealtimeRuntime":0,"CpuShares":0,"CpusetCpus":"","CpusetMems":"","DeviceCgroupRules":null,"Devices":[],"DiskQuota":0,"Dns":[],"DnsOptions":[],"DnsSearch":[],"ExtraHosts":null,"GroupAdd":null,"IOMaximumBandwidth":0,"IOMaximumIOps":0,"IpcMode":"","Isolation":"","KernelMemory":0,"Links":null,"LogConfig":{"Config":{},"Type":""},"Memory":0,"MemoryReservation":0,"MemorySwap":0,"MemorySwappiness":-1,"NanoCpus":0,"NetworkMode":"default","OomKillDisable":false,"OomScoreAdj":0,"PidMode":"","PidsLimit":0,"PortBindings":{},"Privileged":false,"PublishAllPorts":false,"ReadonlyRootfs":false,"RestartPolicy":{"MaximumRetryCount":0,"Name":"no"},"Runtime":"rc","SecurityOpt":null,"ShmSize":0,"UTSMode":"","Ulimits":null,"UsernsMode":"","VolumeDriver":"","VolumesFrom":null},"Hostname":"","Image":"nginx","Labels":{},"NetworkingConfig":{"EndpointsConfig":{}},"OnBuild":null,"OpenStdin":false,"StdinOnce":false,"Tty":true,"User":"","Volumes":{},"WorkingDir":""}"
time="2018-01-23T12:56:16.115736991+05:30" level=debug msg="container mounted via layerStore: &{/home/rgade/docker-data-root/overlay2/e773fd14e1e23e71b59c088bc506bd3e8690142f9f9c609083c482c42f82384a/merged 0x55c998dc10e0 0x55c998dc10e0}"
time="2018-01-23T12:56:16.217428012+05:30" level=debug msg="Calling POST /v1.35/containers/d3a1605e166db1bc66307b44ced44b1f25b98621b08b4ead59888314bdcd57e7/wait?condition=removed"
time="2018-01-23T12:56:16.218423541+05:30" level=debug msg="Calling POST /v1.35/containers/d3a1605e166db1bc66307b44ced44b1f25b98621b08b4ead59888314bdcd57e7/start"
time="2018-01-23T12:56:16.220286574+05:30" level=debug msg="container mounted via layerStore: &{/home/rgade/docker-data-root/overlay2/e773fd14e1e23e71b59c088bc506bd3e8690142f9f9c609083c482c42f82384a/merged 0x55c998dc10e0 0x55c998dc10e0}"
time="2018-01-23T12:56:16.221067450+05:30" level=debug msg="Assigning addresses for endpoint nostalgic_hugle's interface on network bridge"
time="2018-01-23T12:56:16.221118112+05:30" level=debug msg="RequestAddress(LocalDefault/172.17.0.0/16, , map[])"
time="2018-01-23T12:56:16.305129365+05:30" level=debug msg="Assigning addresses for endpoint nostalgic_hugle's interface on network bridge"
time="2018-01-23T12:56:16.463674041+05:30" level=debug msg="Programming external connectivity on endpoint nostalgic_hugle (b99f4cb5aea4cc3dd5f32a5e43405d3b33ac840068b9c265e6b590696c799be7)"
time="2018-01-23T12:56:16.505383138+05:30" level=debug msg="EnableService d3a1605e166db1bc66307b44ced44b1f25b98621b08b4ead59888314bdcd57e7 START"
time="2018-01-23T12:56:16.505444755+05:30" level=debug msg="EnableService d3a1605e166db1bc66307b44ced44b1f25b98621b08b4ead59888314bdcd57e7 DONE"
time="2018-01-23T12:56:16.534986694+05:30" level=debug msg="bundle dir created" bundle=/home/rgade/docker-exec-root/containerd/d3a1605e166db1bc66307b44ced44b1f25b98621b08b4ead59888314bdcd57e7 module=libcontainerd namespace=moby root=/home/rgade/docker-data-root/overlay2/e773fd14e1e23e71b59c088bc506bd3e8690142f9f9c609083c482c42f82384a/merged
time="2018-01-23T12:56:16+05:30" level=debug msg="event published" module="containerd/containers" ns=moby topic="/containers/create" type=containerd.events.ContainerCreate
time="2018-01-23T12:56:16+05:30" level=info msg="shim docker-containerd-shim started" address="/containerd-shim/moby/d3a1605e166db1bc66307b44ced44b1f25b98621b08b4ead59888314bdcd57e7/shim.sock" debug=true module="containerd/tasks" pid=3683
time="2018-01-23T12:56:16+05:30" level=debug msg="registering ttrpc server"
time="2018-01-23T12:56:16+05:30" level=debug msg="serving api on unix socket" socket="[inherited from parent]"**
time="2018-01-23T12:56:20.037948729+05:30" level=debug msg="Calling GET /_ping"
time="2018-01-23T12:56:20.038363211+05:30" level=debug msg="Calling GET /v1.35/containers/json"
time="2018-01-23T12:56:21.857977024+05:30" level=debug msg="Calling GET /_ping"
time="2018-01-23T12:56:21.858486285+05:30" level=debug msg="Calling GET /v1.35/containers/json?all=1"
time="2018-01-23T12:58:14.998614842+05:30" level=debug msg="Calling GET /_ping"

Log when busybox top command was executed

time="2018-01-23T12:58:15.000655981+05:30" level=debug msg="Calling POST /v1.35/containers/create"
time="2018-01-23T12:58:15.001056327+05:30" level=debug msg="form data: {"AttachStderr":false,"AttachStdin":false,"AttachStdout":false,"Cmd":["top"],"Domainname":"","Entrypoint":null,"Env":[],"HostConfig":{"AutoRemove":false,"Binds":null,"BlkioDeviceReadBps":null,"BlkioDeviceReadIOps":null,"BlkioDeviceWriteBps":null,"BlkioDeviceWriteIOps":null,"BlkioWeight":0,"BlkioWeightDevice":[],"CapAdd":null,"CapDrop":null,"Cgroup":"","CgroupParent":"","ConsoleSize":[0,0],"ContainerIDFile":"","CpuCount":0,"CpuPercent":0,"CpuPeriod":0,"CpuQuota":0,"CpuRealtimePeriod":0,"CpuRealtimeRuntime":0,"CpuShares":0,"CpusetCpus":"","CpusetMems":"","DeviceCgroupRules":null,"Devices":[],"DiskQuota":0,"Dns":[],"DnsOptions":[],"DnsSearch":[],"ExtraHosts":null,"GroupAdd":null,"IOMaximumBandwidth":0,"IOMaximumIOps":0,"IpcMode":"","Isolation":"","KernelMemory":0,"Links":null,"LogConfig":{"Config":{},"Type":""},"Memory":0,"MemoryReservation":0,"MemorySwap":0,"MemorySwappiness":-1,"NanoCpus":0,"NetworkMode":"default","OomKillDisable":false,"OomScoreAdj":0,"PidMode":"","PidsLimit":0,"PortBindings":{},"Privileged":false,"PublishAllPorts":false,"ReadonlyRootfs":false,"RestartPolicy":{"MaximumRetryCount":0,"Name":"no"},"Runtime":"rc","SecurityOpt":null,"ShmSize":0,"UTSMode":"","Ulimits":null,"UsernsMode":"","VolumeDriver":"","VolumesFrom":null},"Hostname":"","Image":"busybox","Labels":{},"NetworkingConfig":{"EndpointsConfig":{}},"OnBuild":null,"OpenStdin":false,"StdinOnce":false,"Tty":false,"User":"","Volumes":{},"WorkingDir":""}"
time="2018-01-23T12:58:15.160084075+05:30" level=debug msg="container mounted via layerStore: &{/home/rgade/docker-data-root/overlay2/b19f835f06529a1e9fd54e19d1629c61383961b8315069220049943ad468f0c9/merged 0x55c998dc10e0 0x55c998dc10e0}"
time="2018-01-23T12:58:15.289854905+05:30" level=debug msg="Calling POST /v1.35/containers/ef6b37f13ff4b30d88484f43606d4f3f910a0a8701ef2c7a25ad98dcb460c95c/wait?condition=next-exit"
time="2018-01-23T12:58:15.290809147+05:30" level=debug msg="Calling POST /v1.35/containers/ef6b37f13ff4b30d88484f43606d4f3f910a0a8701ef2c7a25ad98dcb460c95c/start"
time="2018-01-23T12:58:15.292197939+05:30" level=debug msg="container mounted via layerStore: &{/home/rgade/docker-data-root/overlay2/b19f835f06529a1e9fd54e19d1629c61383961b8315069220049943ad468f0c9/merged 0x55c998dc10e0 0x55c998dc10e0}"
time="2018-01-23T12:58:15.292905090+05:30" level=debug msg="Assigning addresses for endpoint boring_wiles's interface on network bridge"
time="2018-01-23T12:58:15.292956264+05:30" level=debug msg="RequestAddress(LocalDefault/172.17.0.0/16, , map[])"
time="2018-01-23T12:58:15.399990240+05:30" level=debug msg="Assigning addresses for endpoint boring_wiles's interface on network bridge"
time="2018-01-23T12:58:15.608321003+05:30" level=debug msg="Programming external connectivity on endpoint boring_wiles (c6f1bee88855a83e11c77860291c5b9e1e4ea7e39dfd515c78da3c1bc6b05201)"
time="2018-01-23T12:58:15.649952419+05:30" level=debug msg="EnableService ef6b37f13ff4b30d88484f43606d4f3f910a0a8701ef2c7a25ad98dcb460c95c START"
time="2018-01-23T12:58:15.650012862+05:30" level=debug msg="EnableService ef6b37f13ff4b30d88484f43606d4f3f910a0a8701ef2c7a25ad98dcb460c95c DONE"
time="2018-01-23T12:58:15.690161560+05:30" level=debug msg="bundle dir created" bundle=/home/rgade/docker-exec-root/containerd/ef6b37f13ff4b30d88484f43606d4f3f910a0a8701ef2c7a25ad98dcb460c95c module=libcontainerd namespace=moby root=/home/rgade/docker-data-root/overlay2/b19f835f06529a1e9fd54e19d1629c61383961b8315069220049943ad468f0c9/merged
time="2018-01-23T12:58:15+05:30" level=debug msg="event published" module="containerd/containers" ns=moby topic="/containers/create" type=containerd.events.ContainerCreate
time="2018-01-23T12:58:15+05:30" level=info msg="shim docker-containerd-shim started" address="/containerd-shim/moby/ef6b37f13ff4b30d88484f43606d4f3f910a0a8701ef2c7a25ad98dcb460c95c/shim.sock" debug=true module="containerd/tasks" pid=3759
time="2018-01-23T12:58:15+05:30" level=debug msg="registering ttrpc server"
time="2018-01-23T12:58:15+05:30" level=debug msg="serving api on unix socket" socket="[inherited from parent]"
time="2018-01-23T12:58:16+05:30" level=debug msg="event published" module="containerd/tasks" ns=moby topic="/tasks/create" type=containerd.events.TaskCreate
time="2018-01-23T12:58:16.023661011+05:30" level=debug msg=event module=libcontainerd namespace=moby topic=/tasks/create
time="2018-01-23T12:58:16+05:30" level=error msg="OCI runtime state failed: unable to retrieve OCI runtime error (open /home/rgade/docker-exec-root/containerd/daemon/io.containerd.runtime.v1.linux/moby/ef6b37f13ff4b30d88484f43606d4f3f910a0a8701ef2c7a25ad98dcb460c95c/log.json: no such file or directory): invalid character 'W' looking for beginning of value: unknown" module="containerd/tasks"
time="2018-01-23T12:58:16+05:30" level=fatal msg="containerd-shim: ttrpc server failure" error="ttrpc: server close"
time="2018-01-23T12:58:16+05:30" level=debug msg="received signal" module=containerd signal=child exited
time="2018-01-23T12:58:16+05:30" level=info msg="shim reaped" id=ef6b37f13ff4b30d88484f43606d4f3f910a0a8701ef2c7a25ad98dcb460c95c module="containerd/tasks"
time="2018-01-23T12:58:16+05:30" level=warning msg="cleaning up after killed shim" id=ef6b37f13ff4b30d88484f43606d4f3f910a0a8701ef2c7a25ad98dcb460c95c module="containerd/tasks" namespace=moby
time="2018-01-23T12:58:16+05:30" level=debug msg="received signal" module=containerd signal=child exited
time="2018-01-23T12:58:16+05:30" level=debug msg="received signal" module=containerd signal=child exited
time="2018-01-23T12:58:16+05:30" level=debug msg="event published" ns=moby topic="/tasks/exit" type=containerd.events.TaskExit
time="2018-01-23T12:58:16.228476413+05:30" level=debug msg=event module=libcontainerd namespace=moby topic=/tasks/exit
time="2018-01-23T12:58:16+05:30" level=debug msg="event published" ns=moby topic="/tasks/delete" type=containerd.events.TaskDelete
time="2018-01-23T12:58:16.228540920+05:30" level=warning msg="Ignoring Exit Event, no such exec command found" container=ef6b37f13ff4b30d88484f43606d4f3f910a0a8701ef2c7a25ad98dcb460c95c exec-id=ef6b37f13ff4b30d88484f43606d4f3f910a0a8701ef2c7a25ad98dcb460c95c exec-pid=3769
time="2018-01-23T12:58:16.228713994+05:30" level=debug msg=event module=libcontainerd namespace=moby topic=/tasks/delete
time="2018-01-23T12:58:16.228734124+05:30" level=info msg="ignoring event" module=libcontainerd namespace=moby topic=/tasks/delete type="*events.TaskDelete"
time="2018-01-23T12:58:16+05:30" level=debug msg="received signal" module=containerd signal=terminated
time="2018-01-23T12:58:16.232833575+05:30" level=error msg="failed to get event" error="rpc error: code = Internal desc = transport is closing" module=libcontainerd namespace=moby
time="2018-01-23T12:58:16.232961375+05:30" level=error msg="failed to delete task after fail start" container=ef6b37f13ff4b30d88484f43606d4f3f910a0a8701ef2c7a25ad98dcb460c95c error="transport is closing: unknown" module=libcontainerd namespace=moby
time="2018-01-23T12:58:16.237339462+05:30" level=error msg="stream copy error: reading from a closed fifo"
time="2018-01-23T12:58:16.232832590+05:30" level=error msg="failed to get event" error="rpc error: code = Internal desc = transport is closing" module=libcontainerd namespace=plugins.moby
time="2018-01-23T12:58:19.365667766+05:30" level=debug msg="daemon is not responding" binary=docker-containerd error="rpc error: code = DeadlineExceeded desc = context deadline exceeded" module=libcontainerd
time="2018-01-23T12:58:19.367399412+05:30" level=info msg="libcontainerd: started new docker-containerd process" pid=3782
time="2018-01-23T12:58:19+05:30" level=info msg="starting containerd" module=containerd revision=89623f28b87a6004d4b785663257362d1658a729 version=v1.0.0
time="2018-01-23T12:58:19+05:30" level=info msg="setting subreaper..." module=containerd
time="2018-01-23T12:58:19+05:30" level=info msg="changing OOM score to -500" module=containerd
time="2018-01-23T12:58:19+05:30" level=info msg="loading plugin "io.containerd.content.v1.content"..." module=containerd type=io.containerd.content.v1
time="2018-01-23T12:58:19+05:30" level=info msg="loading plugin "io.containerd.snapshotter.v1.btrfs"..." module=containerd type=io.containerd.snapshotter.v1
time="2018-01-23T12:58:19+05:30" level=warning msg="failed to load plugin io.containerd.snapshotter.v1.btrfs" error="path /home/rgade/docker-data-root/containerd/daemon/io.containerd.snapshotter.v1.btrfs must be a btrfs filesystem to be used with the btrfs snapshotter" module=containerd
time="2018-01-23T12:58:19+05:30" level=info msg="loading plugin "io.containerd.snapshotter.v1.overlayfs"..." module=containerd type=io.containerd.snapshotter.v1
time="2018-01-23T12:58:19+05:30" level=info msg="loading plugin "io.containerd.metadata.v1.bolt"..." module=containerd type=io.containerd.metadata.v1
time="2018-01-23T12:58:19+05:30" level=warning msg="could not use snapshotter btrfs in metadata plugin" error="path /home/rgade/docker-data-root/containerd/daemon/io.containerd.snapshotter.v1.btrfs must be a btrfs filesystem to be used with the btrfs snapshotter" module="containerd/io.containerd.metadata.v1.bolt"
time="2018-01-23T12:58:19+05:30" level=info msg="loading plugin "io.containerd.differ.v1.walking"..." module=containerd type=io.containerd.differ.v1
time="2018-01-23T12:58:19+05:30" level=info msg="loading plugin "io.containerd.gc.v1.scheduler"..." module=containerd type=io.containerd.gc.v1
time="2018-01-23T12:58:19+05:30" level=info msg="loading plugin "io.containerd.grpc.v1.containers"..." module=containerd type=io.containerd.grpc.v1
time="2018-01-23T12:58:19+05:30" level=info msg="loading plugin "io.containerd.grpc.v1.content"..." module=containerd type=io.containerd.grpc.v1
time="2018-01-23T12:58:19+05:30" level=info msg="loading plugin "io.containerd.grpc.v1.diff"..." module=containerd type=io.containerd.grpc.v1
time="2018-01-23T12:58:19+05:30" level=info msg="loading plugin "io.containerd.grpc.v1.events"..." module=containerd type=io.containerd.grpc.v1
time="2018-01-23T12:58:19+05:30" level=info msg="loading plugin "io.containerd.grpc.v1.healthcheck"..." module=containerd type=io.containerd.grpc.v1
time="2018-01-23T12:58:19+05:30" level=info msg="loading plugin "io.containerd.grpc.v1.images"..." module=containerd type=io.containerd.grpc.v1
time="2018-01-23T12:58:19+05:30" level=info msg="loading plugin "io.containerd.grpc.v1.leases"..." module=containerd type=io.containerd.grpc.v1
time="2018-01-23T12:58:19+05:30" level=info msg="loading plugin "io.containerd.grpc.v1.namespaces"..." module=containerd type=io.containerd.grpc.v1
time="2018-01-23T12:58:19+05:30" level=info msg="loading plugin "io.containerd.grpc.v1.snapshots"..." module=containerd type=io.containerd.grpc.v1
time="2018-01-23T12:58:19+05:30" level=info msg="loading plugin "io.containerd.monitor.v1.cgroups"..." module=containerd type=io.containerd.monitor.v1
time="2018-01-23T12:58:19+05:30" level=info msg="loading plugin "io.containerd.runtime.v1.linux"..." module=containerd type=io.containerd.runtime.v1
time="2018-01-23T12:58:19+05:30" level=debug msg="loading tasks in namespace" module="containerd/io.containerd.runtime.v1.linux" namespace=moby
time="2018-01-23T12:58:19+05:30" level=info msg="loading plugin "io.containerd.grpc.v1.tasks"..." module=containerd type=io.containerd.grpc.v1
time="2018-01-23T12:58:19+05:30" level=info msg="loading plugin "io.containerd.grpc.v1.version"..." module=containerd type=io.containerd.grpc.v1
time="2018-01-23T12:58:19+05:30" level=info msg="loading plugin "io.containerd.grpc.v1.introspection"..." module=containerd type=io.containerd.grpc.v1
time="2018-01-23T12:58:19+05:30" level=info msg=serving... address="/home/rgade/docker-exec-root/containerd/docker-containerd-debug.sock" module="containerd/debug"
time="2018-01-23T12:58:19+05:30" level=info msg=serving... address="/home/rgade/docker-exec-root/containerd/docker-containerd.sock" module="containerd/grpc"
time="2018-01-23T12:58:19+05:30" level=info msg="containerd successfully booted in 0.013588s" module=containerd
time="2018-01-23T12:58:19+05:30" level=debug msg="received signal" module=containerd signal=broken pipe
time="2018-01-23T12:58:19+05:30" level=debug msg="event published" module="containerd/containers" ns=moby topic="/containers/delete" type=containerd.events.ContainerDelete
time="2018-01-23T12:58:19+05:30" level=debug msg="garbage collected" d=68.424828ms module="containerd/io.containerd.gc.v1.scheduler"
time="2018-01-23T12:58:19.583679923+05:30" level=debug msg="Revoking external connectivity on endpoint boring_wiles (c6f1bee88855a83e11c77860291c5b9e1e4ea7e39dfd515c78da3c1bc6b05201)"
time="2018-01-23T12:58:19.587519776+05:30" level=debug msg="DeleteConntrackEntries purged ipv4:0, ipv6:0"
time="2018-01-23T12:58:19.808334991+05:30" level=debug msg="Releasing addresses for endpoint boring_wiles's interface on network bridge"
time="2018-01-23T12:58:19.808402932+05:30" level=debug msg="ReleaseAddress(LocalDefault/172.17.0.0/16, 172.17.0.3)"
time="2018-01-23T12:58:19.931098021+05:30" level=error msg="ef6b37f13ff4b30d88484f43606d4f3f910a0a8701ef2c7a25ad98dcb460c95c cleanup: failed to delete container from containerd: no such container"
time="2018-01-23T12:58:19.931211392+05:30" level=error msg="Handler for POST /v1.35/containers/ef6b37f13ff4b30d88484f43606d4f3f910a0a8701ef2c7a25ad98dcb460c95c/start returned error: ttrpc: client shutting down: EOF: unknown"

time="2018-01-23T12:58:29.479560177+05:30" level=debug msg="Calling GET /_ping"
time="2018-01-23T12:58:29.480027996+05:30" level=debug msg="Calling GET /v1.35/containers/json"
time="2018-01-23T12:58:31.099764158+05:30" level=debug msg="Calling GET /_ping"
time="2018-01-23T12:58:31.100198302+05:30" level=debug msg="Calling GET /v1.35/containers/json?all=1"
time="2018-01-23T12:58:40.512113963+05:30" level=debug msg="Calling GET /_ping"
time="2018-01-23T12:58:40.512568079+05:30" level=debug msg="Calling GET /v1.35/containers/boring_wiles/json"

cannot run bundle alpine generate with runc

hello guys,

to test your project i use this process to generate a bundle : https://github.com/opencontainers/runc#creating-an-oci-bundle

docker export $(docker create alpine) | tar -C rootfs -xvf - && runc spec

but i run railcar i have this error

ERROR - PR_CAPBSET_DROP error -1 ERROR - stack backtrace: 0: 0x556914fff724 - backtrace::backtrace::libunwind::trace::h1d2163fd4d107125 at /root/.cargo/registry/src/github.com-1ecc6299db9ec823/backtrace-0.3.5/src/backtrace/libunwind.rs:53 - backtrace::backtrace::trace::ha976c032de9dba8b at /root/.cargo/registry/src/github.com-1ecc6299db9ec823/backtrace-0.3.5/src/backtrace/mod.rs:42 1: 0x556914ff628c - backtrace::capture::Backtrace::new_unresolved::h284e4e34ef4eb91a at /root/.cargo/registry/src/github.com-1ecc6299db9ec823/backtrace-0.3.5/src/capture.rs:88 2: 0x556914ff61de - backtrace::capture::Backtrace::new::h533f3abfdcafceda at /root/.cargo/registry/src/github.com-1ecc6299db9ec823/backtrace-0.3.5/src/capture.rs:63 3: 0x556914ff33c2 - error_chain::make_backtrace::h4ef9f9b7b4b6c214 at /root/.cargo/registry/src/github.com-1ecc6299db9ec823/error-chain-0.10.0/src/lib.rs:417 4: 0x556914ff345f - <error_chain::State as core::default::Default>::default::hc04cad4582b07f8f at /root/.cargo/registry/src/github.com-1ecc6299db9ec823/error-chain-0.10.0/src/lib.rs:504 5: 0x556914b27bad - railcar::errors::Error::from_kind::h8ccf824c246e1c82 at /root/railcar/<error_chain_processed macros>:52 6: 0x556914b27f9a - <railcar::errors::Error as core::convert::From<caps::errors::Error>>::from::hfa8b3f655d05f90b at src/errors.rs:1 7: 0x556914aeeafb - railcar::capabilities::drop_privileges::h1f2b25965f012fcf at src/capabilities.rs:33 8: 0x556914bf1e51 - railcar::run_container::h2065e49d208fd8e3 at src/main.rs:1315 9: 0x556914bed8c0 - railcar::safe_run_container::ha81e8f1186332423 at src/main.rs:1031 10: 0x556914beb02d - railcar::cmd_run::he388930318bbd4ca at src/main.rs:942 11: 0x556914bdb188 - railcar::run::he4615c08aa0db807 at src/main.rs:434 12: 0x556914bd8a75 - railcar::main::h1c7d23db41775e2e at src/main.rs:202 13: 0x556914b77a31 - std::rt::lang_start::{{closure}}::h677d3f0f792acc34 at /checkout/src/libstd/rt.rs:74 14: 0x556915033c37 - std::rt::lang_start_internal::{{closure}}::h6ddc513d95d559ac at /checkout/src/libstd/rt.rs:59 - std::panicking::try::do_call::h7d33aea9be52481f at /checkout/src/libstd/panicking.rs:480 15: 0x55691504d2be - __rust_maybe_catch_panic at /checkout/src/libpanic_unwind/lib.rs:101 16: 0x5569150392e9 - std::panicking::try::h33108b08b6395be5 at /checkout/src/libstd/panicking.rs:459 - std::panic::catch_unwind::hb0149e8b5a4339ed at /checkout/src/libstd/panic.rs:365 - std::rt::lang_start_internal::h16c0c37ef62d8e5a at /checkout/src/libstd/rt.rs:58 17: 0x556914b77a11 - std::rt::lang_start::hcd81d54dfa5c9e79 at /checkout/src/libstd/rt.rs:74 18: 0x556914bfea5d - main 19: 0x7fddc394cc04 - <unknown> 20: 0x556914aed679 - <unknown> 21: 0x0 - <unknown> ERROR - pipe closed: 'file descriptor closed unexpectedly' ERROR - stack backtrace: 0: 0x556914fff724 - backtrace::backtrace::libunwind::trace::h1d2163fd4d107125 at /root/.cargo/registry/src/github.com-1ecc6299db9ec823/backtrace-0.3.5/src/backtrace/libunwind.rs:53 - backtrace::backtrace::trace::ha976c032de9dba8b at /root/.cargo/registry/src/github.com-1ecc6299db9ec823/backtrace-0.3.5/src/backtrace/mod.rs:42 1: 0x556914ff628c - backtrace::capture::Backtrace::new_unresolved::h284e4e34ef4eb91a at /root/.cargo/registry/src/github.com-1ecc6299db9ec823/backtrace-0.3.5/src/capture.rs:88 2: 0x556914ff61de - backtrace::capture::Backtrace::new::h533f3abfdcafceda at /root/.cargo/registry/src/github.com-1ecc6299db9ec823/backtrace-0.3.5/src/capture.rs:63 3: 0x556914ff33c2 - error_chain::make_backtrace::h4ef9f9b7b4b6c214 at /root/.cargo/registry/src/github.com-1ecc6299db9ec823/error-chain-0.10.0/src/lib.rs:417 4: 0x556914ff345f - <error_chain::State as core::default::Default>::default::hc04cad4582b07f8f at /root/.cargo/registry/src/github.com-1ecc6299db9ec823/error-chain-0.10.0/src/lib.rs:504 5: 0x556914b27bad - railcar::errors::Error::from_kind::h8ccf824c246e1c82 at /root/railcar/<error_chain_processed macros>:52 6: 0x556914b27fe7 - <railcar::errors::Error as core::convert::From<railcar::errors::ErrorKind>>::from::he33423a2ed7e6778 at src/errors.rs:1 7: 0x556914b299f7 - <T as core::convert::Into<U>>::into::h20d87c91a617eef4 at /checkout/src/libcore/convert.rs:415 8: 0x556914bfcb6b - railcar::wait_for_pipe_zero::h32c67eb9aee7d4a1 at src/main.rs:1686 9: 0x556914bf5ed0 - railcar::fork_first::h41cab2c31048e55f at src/main.rs:1439 10: 0x556914beea25 - railcar::run_container::h2065e49d208fd8e3 at src/main.rs:1139 11: 0x556914bed8c0 - railcar::safe_run_container::ha81e8f1186332423 at src/main.rs:1031 12: 0x556914beb02d - railcar::cmd_run::he388930318bbd4ca at src/main.rs:942 13: 0x556914bdb188 - railcar::run::he4615c08aa0db807 at src/main.rs:434 14: 0x556914bd8a75 - railcar::main::h1c7d23db41775e2e at src/main.rs:202 15: 0x556914b77a31 - std::rt::lang_start::{{closure}}::h677d3f0f792acc34 at /checkout/src/libstd/rt.rs:74 16: 0x556915033c37 - std::rt::lang_start_internal::{{closure}}::h6ddc513d95d559ac at /checkout/src/libstd/rt.rs:59 - std::panicking::try::do_call::h7d33aea9be52481f at /checkout/src/libstd/panicking.rs:480 17: 0x55691504d2be - __rust_maybe_catch_panic at /checkout/src/libpanic_unwind/lib.rs:101 18: 0x5569150392e9 - std::panicking::try::h33108b08b6395be5 at /checkout/src/libstd/panicking.rs:459 - std::panic::catch_unwind::hb0149e8b5a4339ed at /checkout/src/libstd/panic.rs:365 - std::rt::lang_start_internal::h16c0c37ef62d8e5a at /checkout/src/libstd/rt.rs:58 19: 0x556914b77a11 - std::rt::lang_start::hcd81d54dfa5c9e79 at /checkout/src/libstd/rt.rs:74 20: 0x556914bfea5d - main 21: 0x7fddc394cc04 - __libc_start_main 22: 0x556914aed679 - <unknown> 23: 0x0 - <unknown>

i comment this part

for c in all.difference(&to_set(&cs.bounding)) {

and rebuild railcar, after that my bundle running.

do you have an idea why ?

Regards

caps: wishlists and filling gaps

Hi, caps-rs author here. I was happily looking at your usecase, trying to identify existing gaps and bits that can be incorporated directly in the lib.

So far I think I have seen:

  • adding a serde-derive for Serialize/Deserialize directly on caps::Capability
  • adding some kind of all() returning a full hashset

Both seems reasonably feasible and easy to add. Any other feedback on it?

nix 0.9.0

compilation fails with the upcoming nix 0.9.0 (required for android)

error[E0432]: unresolved import `nix::c_int`
 --> src/signals.rs:2:5
  |
2 | use nix::c_int;
  |     ^^^^^^^^^^ no `c_int` in the root

error[E0432]: unresolved import `nix::poll::poll`
  --> src/main.rs:41:17
   |
41 | use nix::poll::{poll, PollFd, POLLIN, POLLHUP, POLLNVAL, EventFlags};
   |                 ^^^^ Could not find `poll` in `nix`

error[E0432]: unresolved import `nix::poll::PollFd`
  --> src/main.rs:41:23
   |
41 | use nix::poll::{poll, PollFd, POLLIN, POLLHUP, POLLNVAL, EventFlags};
   |                       ^^^^^^ Could not find `poll` in `nix`

error[E0432]: unresolved import `nix::poll::POLLIN`
  --> src/main.rs:41:31
   |
41 | use nix::poll::{poll, PollFd, POLLIN, POLLHUP, POLLNVAL, EventFlags};
   |                               ^^^^^^ Could not find `poll` in `nix`

error[E0432]: unresolved import `nix::poll::POLLHUP`
  --> src/main.rs:41:39
   |
41 | use nix::poll::{poll, PollFd, POLLIN, POLLHUP, POLLNVAL, EventFlags};
   |                                       ^^^^^^^ Could not find `poll` in `nix`

error[E0432]: unresolved import `nix::poll::POLLNVAL`
  --> src/main.rs:41:48
   |
41 | use nix::poll::{poll, PollFd, POLLIN, POLLHUP, POLLNVAL, EventFlags};
   |                                                ^^^^^^^^ Could not find `poll` in `nix`

error[E0432]: unresolved import `nix::poll::EventFlags`
  --> src/main.rs:41:58
   |
41 | use nix::poll::{poll, PollFd, POLLIN, POLLHUP, POLLNVAL, EventFlags};
   |                                                          ^^^^^^^^^^ Could not find `poll` in `nix`

error[E0425]: cannot find function `lsetxattr` in module `libc`
  --> src/nix_ext.rs:16:15
   |
16 |         libc::lsetxattr(
   |               ^^^^^^^^^ did you mean `tcsetattr`?
   |
help: possible candidate is found in another module, you can import it into scope
   | use nix_ext::lsetxattr;

error[E0425]: cannot find function `set_dumpable` in module `prctl`
   --> src/main.rs:906:28
    |
906 |     if let Err(e) = prctl::set_dumpable(false) {
    |                            ^^^^^^^^^^^^ not found in `prctl`

error[E0425]: cannot find function `set_child_subreaper` in module `prctl`
   --> src/main.rs:975:32
    |
975 |         if let Err(e) = prctl::set_child_subreaper(true) {
    |                                ^^^^^^^^^^^^^^^^^^^ not found in `prctl`

error[E0425]: cannot find function `set_no_new_privileges` in module `prctl`
    --> src/main.rs:1143:32
     |
1143 |         if let Err(e) = prctl::set_no_new_privileges(true) {
     |                                ^^^^^^^^^^^^^^^^^^^^^ not found in `prctl`

error[E0425]: cannot find function `set_keep_capabilities` in module `prctl`
    --> src/main.rs:1602:28
     |
1602 |     if let Err(e) = prctl::set_keep_capabilities(true) {
     |                            ^^^^^^^^^^^^^^^^^^^^^ not found in `prctl`

error[E0425]: cannot find function `set_keep_capabilities` in module `prctl`
    --> src/main.rs:1611:28
     |
1611 |     if let Err(e) = prctl::set_keep_capabilities(false) {
     |                            ^^^^^^^^^^^^^^^^^^^^^ not found in `prctl`

error[E0425]: cannot find function `set_name` in module `prctl`
    --> src/main.rs:1639:28
     |
1639 |     if let Err(e) = prctl::set_name(name) {
     |                            ^^^^^^^^ not found in `prctl`
     |
help: possible candidate is found in another module, you can import it into scope
     | use set_name;

error[E0599]: no method named `errno` found for type `nix::Error` in the current scope
   --> src/main.rs:637:22
    |
637 |                 if e.errno() != Errno::ENOENT {
    |                      ^^^^^

error[E0599]: no method named `errno` found for type `nix::Error` in the current scope
   --> src/main.rs:648:18
    |
648 |             if e.errno() != Errno::ENOENT {
    |                  ^^^^^

error[E0599]: no method named `errno` found for type `nix::Error` in the current scope
   --> src/main.rs:759:26
    |
759 |                     if n.errno() == Errno::ESRCH {
    |                          ^^^^^

error[E0308]: mismatched types
   --> src/main.rs:860:59
    |
860 |                     let (exit_code, sig) = wait_for_child(child)?;
    |                                                           ^^^^^ expected i32, found struct `nix::unistd::Pid`
    |
    = note: expected type `i32`
               found type `nix::unistd::Pid`

error[E0308]: mismatched types
   --> src/main.rs:885:49
    |
885 |             let (exit_code, _) = wait_for_child(child)?;
    |                                                 ^^^^^ expected i32, found struct `nix::unistd::Pid`
    |
    = note: expected type `i32`
               found type `nix::unistd::Pid`

error[E0308]: mismatched types
    --> src/main.rs:1250:45
     |
1250 |                 let (_, _) = wait_for_child(child)?;
     |                                             ^^^^^ expected i32, found struct `nix::unistd::Pid`
     |
     = note: expected type `i32`
                found type `nix::unistd::Pid`

error[E0599]: no method named `errno` found for type `nix::Error` in the current scope
    --> src/main.rs:1419:18
     |
1419 |             if e.errno() != Errno::ENOENT {
     |                  ^^^^^

error[E0277]: the trait bound `std::option::Option<nix::unistd::Pid>: std::convert::From<{integer}>` is not satisfied
    --> src/main.rs:1529:28
     |
1529 |         let result = match waitpid(-1, None) {
     |                            ^^^^^^^ the trait `std::convert::From<{integer}>` is not implemented for `std::option::Option<nix::unistd::Pid>`
     |
     = help: the following implementations were found:
               <std::option::Option<T> as std::convert::From<T>>
     = note: required because of the requirements on the impl of `std::convert::Into<std::option::Option<nix::unistd::Pid>>` for `{integer}`
     = note: required by `nix::sys::wait::waitpid`

error[E0599]: no method named `errno` found for type `nix::Error` in the current scope
    --> src/main.rs:1532:22
     |
1532 |                 if e.errno() == Errno::EINTR {
     |                      ^^^^^

error[E0308]: mismatched types
    --> src/main.rs:1542:42
     |
1542 |                 if child != -1 && pid != child {
     |                                          ^^^^^ expected struct `nix::unistd::Pid`, found i32
     |
     = note: expected type `nix::unistd::Pid`
                found type `i32`

error[E0308]: mismatched types
    --> src/main.rs:1549:42
     |
1549 |                 if child != -1 && pid != child {
     |                                          ^^^^^ expected struct `nix::unistd::Pid`, found i32
     |
     = note: expected type `nix::unistd::Pid`
                found type `i32`

error[E0308]: mismatched types
    --> src/main.rs:1579:41
     |
1579 |     let mut result = WaitStatus::Exited(0, 0);
     |                                         ^ expected struct `nix::unistd::Pid`, found integral variable
     |
     = note: expected type `nix::unistd::Pid`
                found type `{integer}`

error[E0277]: the trait bound `std::option::Option<nix::unistd::Pid>: std::convert::From<{integer}>` is not satisfied
    --> src/main.rs:1581:15
     |
1581 |         match waitpid(-1, Some(WNOHANG)) {
     |               ^^^^^^^ the trait `std::convert::From<{integer}>` is not implemented for `std::option::Option<nix::unistd::Pid>`
     |
     = help: the following implementations were found:
               <std::option::Option<T> as std::convert::From<T>>
     = note: required because of the requirements on the impl of `std::convert::Into<std::option::Option<nix::unistd::Pid>>` for `{integer}`
     = note: required by `nix::sys::wait::waitpid`

error[E0599]: no method named `errno` found for type `nix::Error` in the current scope
    --> src/main.rs:1583:22
     |
1583 |                 if e.errno() != Errno::ECHILD {
     |                      ^^^^^

error[E0308]: mismatched types
    --> src/main.rs:1605:15
     |
1605 |     setresgid(gid, gid, gid)?;
     |               ^^^ expected struct `nix::unistd::Gid`, found u32
     |
     = note: expected type `nix::unistd::Gid`
                found type `u32`

error[E0308]: mismatched types
    --> src/main.rs:1605:20
     |
1605 |     setresgid(gid, gid, gid)?;
     |                    ^^^ expected struct `nix::unistd::Gid`, found u32
     |
     = note: expected type `nix::unistd::Gid`
                found type `u32`

error[E0308]: mismatched types
    --> src/main.rs:1605:25
     |
1605 |     setresgid(gid, gid, gid)?;
     |                         ^^^ expected struct `nix::unistd::Gid`, found u32
     |
     = note: expected type `nix::unistd::Gid`
                found type `u32`

error[E0308]: mismatched types
    --> src/main.rs:1606:15
     |
1606 |     setresuid(uid, uid, uid)?;
     |               ^^^ expected struct `nix::unistd::Uid`, found u32
     |
     = note: expected type `nix::unistd::Uid`
                found type `u32`

error[E0308]: mismatched types
    --> src/main.rs:1606:20
     |
1606 |     setresuid(uid, uid, uid)?;
     |                    ^^^ expected struct `nix::unistd::Uid`, found u32
     |
     = note: expected type `nix::unistd::Uid`
                found type `u32`

error[E0308]: mismatched types
    --> src/main.rs:1606:25
     |
1606 |     setresuid(uid, uid, uid)?;
     |                         ^^^ expected struct `nix::unistd::Uid`, found u32
     |
     = note: expected type `nix::unistd::Uid`
                found type `u32`

error[E0599]: no method named `errno` found for type `nix::Error` in the current scope
   --> src/mounts.rs:343:14
    |
343 |         if e.errno() != Errno::EINVAL {
    |              ^^^^^

error[E0308]: mismatched types
   --> src/mounts.rs:443:34
    |
443 |         Mode::from_bits_truncate(dev.file_mode.unwrap_or(0)),
    |                                  ^^^^^^^^^^^^^^^^^^^^^^^^^^ expected u16, found u32

error[E0308]: mismatched types
   --> src/mounts.rs:444:9
    |
444 |         makedev(dev.major, dev.minor),
    |         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected u32, found u64
    |
    = help: here are some functions which might fulfill your needs:
            - .count_ones()
            - .count_zeros()
            - .leading_zeros()
            - .trailing_zeros()

error[E0308]: mismatched types
   --> src/mounts.rs:446:27
    |
446 |     chown(&dev.path[1..], dev.uid, dev.gid)?;
    |                           ^^^^^^^ expected struct `nix::unistd::Uid`, found u32
    |
    = note: expected type `std::option::Option<nix::unistd::Uid>`
               found type `std::option::Option<u32>`
    = help: here are some functions which might fulfill your needs:
            - .take()
            - .unwrap()
            - .unwrap_or_default()

error[E0308]: mismatched types
   --> src/mounts.rs:446:36
    |
446 |     chown(&dev.path[1..], dev.uid, dev.gid)?;
    |                                    ^^^^^^^ expected struct `nix::unistd::Gid`, found u32
    |
    = note: expected type `std::option::Option<nix::unistd::Gid>`
               found type `std::option::Option<u32>`
    = help: here are some functions which might fulfill your needs:
            - .take()
            - .unwrap()
            - .unwrap_or_default()

error[E0599]: no method named `errno` found for type `nix::Error` in the current scope
   --> src/mounts.rs:482:14
    |
482 |         if e.errno() != Errno::ENOENT && e.errno() != Errno::ENOTDIR {
    |              ^^^^^

error[E0599]: no method named `errno` found for type `nix::Error` in the current scope
   --> src/mounts.rs:482:44
    |
482 |         if e.errno() != Errno::ENOENT && e.errno() != Errno::ENOTDIR {
    |                                            ^^^^^

error[E0599]: no method named `errno` found for type `nix::Error` in the current scope
   --> src/mounts.rs:505:14
    |
505 |         if e.errno() != Errno::ENOENT {
    |              ^^^^^

error[E0308]: mismatched types
  --> src/signals.rs:24:22
   |
24 |         let _ = kill(CHILD_PID, Signal::from_c_int(signo).unwrap());
   |                      ^^^^^^^^^ expected struct `nix::unistd::Pid`, found i32
   |
   = note: expected type `nix::unistd::Pid`
              found type `i32`

error[E0308]: mismatched types
  --> src/signals.rs:56:10
   |
56 |     kill(0, signal)?;
   |          ^ expected struct `nix::unistd::Pid`, found integral variable
   |
   = note: expected type `nix::unistd::Pid`
              found type `{integer}`

error[E0308]: mismatched types
   --> src/signals.rs:102:10
    |
102 |     kill(pid, signal)?;
    |          ^^^ expected struct `nix::unistd::Pid`, found i32
    |
    = note: expected type `nix::unistd::Pid`
               found type `i32`

error[E0308]: mismatched types
  --> src/nix_ext.rs:46:19
   |
46 |         rlim_cur: soft,
   |                   ^^^^ expected u32, found u64
   |
   = help: here are some functions which might fulfill your needs:
           - .count_ones()
           - .count_zeros()
           - .leading_zeros()
           - .trailing_zeros()

error[E0308]: mismatched types
  --> src/nix_ext.rs:47:19
   |
47 |         rlim_max: hard,
   |                   ^^^^ expected u32, found u64
   |
   = help: here are some functions which might fulfill your needs:
           - .count_ones()
           - .count_zeros()
           - .leading_zeros()
           - .trailing_zeros()


failure on systemd cgroup flag

[root@infra0 ~]# docker run -it --runtime=railcar alpine 
docker: Error response from daemon: OCI runtime create failed: unable to retrieve OCI runtime error (open /run/docker/containerd/daemon/io.containerd.runtime.v1.linux/moby/551ea273e14d5adda4ca2ae3632721b6a4926a498b319a2d14eeddd62a5eb0c3/log.json: no such file or directory): /usr/local/bin/railcar did not terminate sucessfully: error: Found argument '--systemd-cgroup' which wasn't expected, or isn't valid in this context

USAGE:
    railcar --log <log> --log-format <log-format> --root <r> <SUBCOMMAND>

For more information try --help
: unknown.

Versions:

[root@infra0 ~]# railcar --version
Railcar 1.0.4
[root@infra0 ~]# docker --version
Docker version 18.06.1-ce, build e68fc7a
[root@infra0 ~]# uname -r
3.10.0-862.11.6.el7.x86_64

optional caps and cgroup

we're trying railcar on a whole range of hardware, and two things came up:

  • cgroups might be broken on mips
  • caps are broken on android

generally, would you be ok to implement these as feature flags?

Are cgroups nessesary for cleanup of a pid namespace or will killing pid1 cleanup all the other processes in the pid ns anyway?

testability

It'd be nice to have couple of unit tests and integration tests to verify implementation changes.

I am not sure how to create more complex test cases.

Status of the project

Hey, I really like the idea of having a Rust OCI runtime, but this project does not seem to have a clear maintainership, right?

Is it still supported by oracle? Do you consider having a base set of code owners to bring the project forward?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.