daemon/start_unix.go
934328d8
 // +build !windows
 
4f0d95fa
 package daemon // import "github.com/docker/docker/daemon"
7b2e5216
 
 import (
ddae20c0
 	"fmt"
 	"os/exec"
 	"path/filepath"
 
44f3dd76
 	"github.com/containerd/containerd/runtime/linux/runctypes"
7b2e5216
 	"github.com/docker/docker/container"
d453fe35
 	"github.com/docker/docker/errdefs"
ebcb7d6b
 	"github.com/pkg/errors"
7b2e5216
 )
 
ddae20c0
 func (daemon *Daemon) getRuntimeScript(container *container.Container) (string, error) {
 	name := container.HostConfig.Runtime
 	rt := daemon.configStore.GetRuntime(name)
 	if rt == nil {
87a12421
 		return "", errdefs.InvalidParameter(errors.Errorf("no such runtime '%s'", name))
ddae20c0
 	}
7b2e5216
 
ddae20c0
 	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) {
d7ceda4e
 	// Ensure a runtime has been assigned to this container
 	if container.HostConfig.Runtime == "" {
9391a822
 		container.HostConfig.Runtime = daemon.configStore.GetDefaultRuntimeName()
edad5270
 		container.CheckpointTo(daemon.containersReplica)
d7ceda4e
 	}
 
ddae20c0
 	path, err := daemon.getRuntimeScript(container)
 	if err != nil {
 		return nil, err
7b2e5216
 	}
aa3ce07c
 	opts := &runctypes.RuncOptions{
ddae20c0
 		Runtime: path,
 		RuntimeRoot: filepath.Join(daemon.configStore.ExecRoot,
 			fmt.Sprintf("runtime-%s", container.HostConfig.Runtime)),
 	}
 
7f88fca4
 	if UsingSystemd(daemon.configStore) {
ddae20c0
 		opts.SystemdCgroup = true
7f88fca4
 	}
7b2e5216
 
ddae20c0
 	return opts, nil
7b2e5216
 }