// +build !windows package daemon import ( "fmt" "os/exec" "path/filepath" "github.com/containerd/containerd/linux/runctypes" "github.com/docker/docker/container" "github.com/docker/docker/errdefs" "github.com/pkg/errors" ) func (daemon *Daemon) getRuntimeScript(container *container.Container) (string, error) { name := container.HostConfig.Runtime rt := daemon.configStore.GetRuntime(name) if rt == nil { return "", errdefs.InvalidParameter(errors.Errorf("no such runtime '%s'", name)) } if len(rt.Args) > 0 { // First check that the target exist, as using it in a script won't // give us the right error if _, err := exec.LookPath(rt.Path); err != nil { return "", translateContainerdStartErr(container.Path, container.SetExitCode, err) } return filepath.Join(daemon.configStore.Root, "runtimes", name), nil } return rt.Path, nil } // getLibcontainerdCreateOptions callers must hold a lock on the container func (daemon *Daemon) getLibcontainerdCreateOptions(container *container.Container) (interface{}, error) { // Ensure a runtime has been assigned to this container if container.HostConfig.Runtime == "" { container.HostConfig.Runtime = daemon.configStore.GetDefaultRuntimeName() container.CheckpointTo(daemon.containersReplica) } path, err := daemon.getRuntimeScript(container) if err != nil { return nil, err } opts := &runctypes.RuncOptions{ Runtime: path, RuntimeRoot: filepath.Join(daemon.configStore.ExecRoot, fmt.Sprintf("runtime-%s", container.HostConfig.Runtime)), } if UsingSystemd(daemon.configStore) { opts.SystemdCgroup = true } return opts, nil }