diff options
author | Vincent Batts <vbatts@hashbangbash.com> | 2018-11-02 10:18:28 -0400 |
---|---|---|
committer | Giuseppe Scrivano <gscrivan@redhat.com> | 2019-01-14 10:03:40 +0100 |
commit | 650cf122e1b33f4d8f4426ee1cc1a4bf00c14798 (patch) | |
tree | f85f464a253c05a889854ad54633358939cf48ae /libpod/runtime.go | |
parent | 140ae25c4d0c7ba89a0bb7ae16f81f90d20be535 (diff) | |
download | podman-650cf122e1b33f4d8f4426ee1cc1a4bf00c14798.tar.gz podman-650cf122e1b33f4d8f4426ee1cc1a4bf00c14798.tar.bz2 podman-650cf122e1b33f4d8f4426ee1cc1a4bf00c14798.zip |
libpod: allow multiple oci runtimes
This deprecates the libpod.conf variable of `runtime_path=`, and now has
`runtimes=`, like a map for naming the runtime, preparing for a
`--runtime` flag to `podman run` (i.e. runc, kata, etc.)
Reference: https://github.com/containers/libpod/issues/1750
Signed-off-by: Vincent Batts <vbatts@hashbangbash.com>
Diffstat (limited to 'libpod/runtime.go')
-rw-r--r-- | libpod/runtime.go | 64 |
1 files changed, 39 insertions, 25 deletions
diff --git a/libpod/runtime.go b/libpod/runtime.go index c9471247c..81d4cf3e3 100644 --- a/libpod/runtime.go +++ b/libpod/runtime.go @@ -86,7 +86,7 @@ type Runtime struct { imageContext *types.SystemContext ociRuntime *OCIRuntime netPlugin ocicni.CNIPlugin - ociRuntimePath string + ociRuntimePath OCIRuntimePath conmonPath string valid bool lock sync.RWMutex @@ -96,6 +96,14 @@ type Runtime struct { configuredFrom *runtimeConfiguredFrom } +// OCIRuntimePath contains information about an OCI runtime. +type OCIRuntimePath struct { + // Name of the runtime to refer to by the --runtime flag + Name string + // Paths to check for this executable + Paths []string +} + // RuntimeConfig contains configuration options used to set up the runtime type RuntimeConfig struct { // StorageConfig is the configuration used by containers/storage @@ -118,10 +126,8 @@ type RuntimeConfig struct { // cause conflicts in containers/storage // As such this is not exposed via the config file StateType RuntimeStateStore `toml:"-"` - // RuntimePath is the path to OCI runtime binary for launching - // containers - // The first path pointing to a valid file will be used - RuntimePath []string `toml:"runtime_path"` + // OCIRuntimes are the set of configured OCI runtimes (default is runc) + OCIRuntimes []OCIRuntimePath `toml:"runtimes"` // ConmonPath is the path to the Conmon binary used for managing // containers // The first path pointing to a valid file will be used @@ -213,14 +219,19 @@ var ( StorageConfig: storage.StoreOptions{}, ImageDefaultTransport: DefaultTransport, StateType: BoltDBStateStore, - RuntimePath: []string{ - "/usr/bin/runc", - "/usr/sbin/runc", - "/usr/local/bin/runc", - "/usr/local/sbin/runc", - "/sbin/runc", - "/bin/runc", - "/usr/lib/cri-o-runc/sbin/runc", + OCIRuntimes: []OCIRuntimePath{ + { + Name: "runc", + Paths: []string{ + "/usr/bin/runc", + "/usr/sbin/runc", + "/usr/local/bin/runc", + "/usr/local/sbin/runc", + "/sbin/runc", + "/bin/runc", + "/usr/lib/cri-o-runc/sbin/runc", + }, + }, }, ConmonPath: []string{ "/usr/libexec/podman/conmon", @@ -453,22 +464,25 @@ func NewRuntimeFromConfig(configPath string, options ...RuntimeOption) (runtime func makeRuntime(runtime *Runtime) (err error) { // Find a working OCI runtime binary foundRuntime := false - for _, path := range runtime.config.RuntimePath { - stat, err := os.Stat(path) - if err != nil { - continue - } - if stat.IsDir() { - continue +outer: + for _, oruntime := range runtime.config.OCIRuntimes { + for _, path := range oruntime.Paths { + stat, err := os.Stat(path) + if err != nil { + continue + } + if stat.IsDir() { + continue + } + foundRuntime = true + runtime.ociRuntimePath = OCIRuntimePath{Name: oruntime.Name, Paths: []string{path}} + break outer } - foundRuntime = true - runtime.ociRuntimePath = path - break } if !foundRuntime { return errors.Wrapf(ErrInvalidArg, "could not find a working binary (configured options: %v)", - runtime.config.RuntimePath) + runtime.config.OCIRuntimes) } // Find a working conmon binary @@ -619,7 +633,7 @@ func makeRuntime(runtime *Runtime) (err error) { } // Make an OCI runtime to perform container operations - ociRuntime, err := newOCIRuntime("runc", runtime.ociRuntimePath, + ociRuntime, err := newOCIRuntime(runtime.ociRuntimePath, runtime.conmonPath, runtime.config.ConmonEnvVars, runtime.config.CgroupManager, runtime.config.TmpDir, runtime.config.MaxLogSize, runtime.config.NoPivotRoot, |