mirror of
https://github.com/containers/podman.git
synced 2025-08-06 11:32:07 +08:00
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:

committed by
Giuseppe Scrivano

parent
140ae25c4d
commit
650cf122e1
@ -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
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
}
|
||||
|
@ -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,
|
||||
|
Reference in New Issue
Block a user