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>
This commit is contained in:
Vincent Batts
2018-11-02 10:18:28 -04:00
committed by Giuseppe Scrivano
parent 140ae25c4d
commit 650cf122e1
4 changed files with 50 additions and 32 deletions

View File

@ -4,7 +4,6 @@ import (
"bufio"
"bytes"
"fmt"
"github.com/containers/buildah"
"io/ioutil"
"os"
"runtime"
@ -12,6 +11,7 @@ import (
"strings"
"time"
"github.com/containers/buildah"
"github.com/containers/libpod/pkg/rootless"
"github.com/containers/libpod/pkg/util"
"github.com/containers/libpod/utils"
@ -184,12 +184,12 @@ func (r *Runtime) GetConmonVersion() (string, error) {
// GetOCIRuntimePath returns the path to the OCI Runtime Path the runtime is using
func (r *Runtime) GetOCIRuntimePath() string {
return r.ociRuntimePath
return r.ociRuntimePath.Paths[0]
}
// GetOCIRuntimeVersion returns a string representation of the oci runtimes version
func (r *Runtime) GetOCIRuntimeVersion() (string, error) {
output, err := utils.ExecCmd(r.ociRuntimePath, "--version")
output, err := utils.ExecCmd(r.ociRuntimePath.Paths[0], "--version")
if err != nil {
return "", err
}

View File

@ -75,10 +75,10 @@ type syncInfo struct {
}
// Make a new OCI runtime with provided options
func newOCIRuntime(name string, path string, conmonPath string, conmonEnv []string, cgroupManager string, tmpDir string, logSizeMax int64, noPivotRoot bool, reservePorts bool) (*OCIRuntime, error) {
func newOCIRuntime(oruntime OCIRuntimePath, conmonPath string, conmonEnv []string, cgroupManager string, tmpDir string, logSizeMax int64, noPivotRoot bool, reservePorts bool) (*OCIRuntime, error) {
runtime := new(OCIRuntime)
runtime.name = name
runtime.path = path
runtime.name = oruntime.Name
runtime.path = oruntime.Paths[0]
runtime.conmonPath = conmonPath
runtime.conmonEnv = conmonEnv
runtime.cgroupManager = cgroupManager

View File

@ -147,7 +147,11 @@ func WithOCIRuntime(runtimePath string) RuntimeOption {
return errors.Wrapf(ErrInvalidArg, "must provide a valid path")
}
rt.config.RuntimePath = []string{runtimePath}
rt.config.OCIRuntimes = []OCIRuntimePath{
{
Paths: []string{runtimePath},
},
}
return nil
}

View File

@ -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
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
}
if stat.IsDir() {
continue
}
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,