2016-06-07 03:45:21 -04:00
|
|
|
// +build !windows
|
|
|
|
|
2018-02-05 16:05:59 -05:00
|
|
|
package daemon // import "github.com/docker/docker/daemon"
|
2016-05-23 17:49:50 -04:00
|
|
|
|
|
|
|
import (
|
2017-09-22 09:52:41 -04:00
|
|
|
"fmt"
|
|
|
|
"os/exec"
|
|
|
|
"path/filepath"
|
|
|
|
|
2018-06-08 20:39:07 -04:00
|
|
|
"github.com/containerd/containerd/runtime/linux/runctypes"
|
2016-05-23 17:49:50 -04:00
|
|
|
"github.com/docker/docker/container"
|
2018-01-11 14:53:06 -05:00
|
|
|
"github.com/docker/docker/errdefs"
|
2017-07-19 10:20:13 -04:00
|
|
|
"github.com/pkg/errors"
|
2016-05-23 17:49:50 -04:00
|
|
|
)
|
|
|
|
|
2017-09-22 09:52:41 -04:00
|
|
|
func (daemon *Daemon) getRuntimeScript(container *container.Container) (string, error) {
|
|
|
|
name := container.HostConfig.Runtime
|
|
|
|
rt := daemon.configStore.GetRuntime(name)
|
|
|
|
if rt == nil {
|
2017-11-28 23:09:37 -05:00
|
|
|
return "", errdefs.InvalidParameter(errors.Errorf("no such runtime '%s'", name))
|
2017-09-22 09:52:41 -04:00
|
|
|
}
|
2016-05-23 17:49:50 -04:00
|
|
|
|
2017-09-22 09:52:41 -04:00
|
|
|
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) {
|
2016-06-20 14:21:01 -04:00
|
|
|
// Ensure a runtime has been assigned to this container
|
|
|
|
if container.HostConfig.Runtime == "" {
|
2017-01-12 14:24:30 -05:00
|
|
|
container.HostConfig.Runtime = daemon.configStore.GetDefaultRuntimeName()
|
2017-03-27 13:18:53 -04:00
|
|
|
container.CheckpointTo(daemon.containersReplica)
|
2016-06-20 14:21:01 -04:00
|
|
|
}
|
|
|
|
|
2017-09-22 09:52:41 -04:00
|
|
|
path, err := daemon.getRuntimeScript(container)
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
2016-05-23 17:49:50 -04:00
|
|
|
}
|
2017-11-29 19:15:20 -05:00
|
|
|
opts := &runctypes.RuncOptions{
|
2017-09-22 09:52:41 -04:00
|
|
|
Runtime: path,
|
|
|
|
RuntimeRoot: filepath.Join(daemon.configStore.ExecRoot,
|
|
|
|
fmt.Sprintf("runtime-%s", container.HostConfig.Runtime)),
|
|
|
|
}
|
|
|
|
|
2016-08-26 09:33:26 -04:00
|
|
|
if UsingSystemd(daemon.configStore) {
|
2017-09-22 09:52:41 -04:00
|
|
|
opts.SystemdCgroup = true
|
2016-08-26 09:33:26 -04:00
|
|
|
}
|
2016-05-23 17:49:50 -04:00
|
|
|
|
2017-09-22 09:52:41 -04:00
|
|
|
return opts, nil
|
2016-05-23 17:49:50 -04:00
|
|
|
}
|