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 |
} |