add NewContainerOpts to libcontainerd.Create
Signed-off-by: Evan Hazlett <ejhazlett@gmail.com>
This commit is contained in:
parent
92cc603036
commit
35ac4be5d5
5 changed files with 26 additions and 8 deletions
|
@ -5,6 +5,9 @@ import (
|
||||||
"runtime"
|
"runtime"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"github.com/containerd/containerd"
|
||||||
|
"github.com/containerd/containerd/containers"
|
||||||
|
"github.com/docker/distribution/reference"
|
||||||
"github.com/docker/docker/api/types"
|
"github.com/docker/docker/api/types"
|
||||||
containertypes "github.com/docker/docker/api/types/container"
|
containertypes "github.com/docker/docker/api/types/container"
|
||||||
"github.com/docker/docker/container"
|
"github.com/docker/docker/container"
|
||||||
|
@ -179,7 +182,12 @@ func (daemon *Daemon) containerStart(container *container.Container, checkpoint
|
||||||
|
|
||||||
ctx := context.TODO()
|
ctx := context.TODO()
|
||||||
|
|
||||||
err = daemon.containerd.Create(ctx, container.ID, spec, createOptions)
|
imageRef, err := reference.ParseNormalizedNamed(container.Config.Image)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
err = daemon.containerd.Create(ctx, container.ID, spec, createOptions, withImageName(imageRef.String()))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if errdefs.IsConflict(err) {
|
if errdefs.IsConflict(err) {
|
||||||
logrus.WithError(err).WithField("container", container.ID).Error("Container not cleaned up from containerd from previous run")
|
logrus.WithError(err).WithField("container", container.ID).Error("Container not cleaned up from containerd from previous run")
|
||||||
|
@ -188,7 +196,7 @@ func (daemon *Daemon) containerStart(container *container.Container, checkpoint
|
||||||
if err := daemon.containerd.Delete(ctx, container.ID); err != nil && !errdefs.IsNotFound(err) {
|
if err := daemon.containerd.Delete(ctx, container.ID); err != nil && !errdefs.IsNotFound(err) {
|
||||||
logrus.WithError(err).WithField("container", container.ID).Error("Error cleaning up stale containerd container object")
|
logrus.WithError(err).WithField("container", container.ID).Error("Error cleaning up stale containerd container object")
|
||||||
}
|
}
|
||||||
err = daemon.containerd.Create(ctx, container.ID, spec, createOptions)
|
err = daemon.containerd.Create(ctx, container.ID, spec, createOptions, withImageName(imageRef.String()))
|
||||||
}
|
}
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return translateContainerdStartErr(container.Path, container.SetExitCode, err)
|
return translateContainerdStartErr(container.Path, container.SetExitCode, err)
|
||||||
|
@ -265,3 +273,10 @@ func (daemon *Daemon) Cleanup(container *container.Container) {
|
||||||
logrus.Errorf("%s cleanup: failed to delete container from containerd: %v", container.ID, err)
|
logrus.Errorf("%s cleanup: failed to delete container from containerd: %v", container.ID, err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func withImageName(n string) containerd.NewContainerOpts {
|
||||||
|
return func(ctx context.Context, _ *containerd.Client, c *containers.Container) error {
|
||||||
|
c.Image = n
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -28,7 +28,7 @@ func (c *MockContainerdClient) Version(ctx context.Context) (containerd.Version,
|
||||||
func (c *MockContainerdClient) Restore(ctx context.Context, containerID string, attachStdio libcontainerdtypes.StdioCallback) (alive bool, pid int, p libcontainerdtypes.Process, err error) {
|
func (c *MockContainerdClient) Restore(ctx context.Context, containerID string, attachStdio libcontainerdtypes.StdioCallback) (alive bool, pid int, p libcontainerdtypes.Process, err error) {
|
||||||
return false, 0, &mockProcess{}, nil
|
return false, 0, &mockProcess{}, nil
|
||||||
}
|
}
|
||||||
func (c *MockContainerdClient) Create(ctx context.Context, containerID string, spec *specs.Spec, runtimeOptions interface{}) error {
|
func (c *MockContainerdClient) Create(ctx context.Context, containerID string, spec *specs.Spec, runtimeOptions interface{}, opts ...containerd.NewContainerOpts) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
func (c *MockContainerdClient) Start(ctx context.Context, containerID, checkpointDir string, withStdin bool, attachStdio libcontainerdtypes.StdioCallback) (pid int, err error) {
|
func (c *MockContainerdClient) Start(ctx context.Context, containerID, checkpointDir string, withStdin bool, attachStdio libcontainerdtypes.StdioCallback) (pid int, err error) {
|
||||||
|
|
|
@ -152,7 +152,7 @@ func (c *client) Version(ctx context.Context) (containerd.Version, error) {
|
||||||
// "ImagePath": "C:\\\\control\\\\windowsfilter\\\\65bf96e5760a09edf1790cb229e2dfb2dbd0fcdc0bf7451bae099106bfbfea0c\\\\UtilityVM"
|
// "ImagePath": "C:\\\\control\\\\windowsfilter\\\\65bf96e5760a09edf1790cb229e2dfb2dbd0fcdc0bf7451bae099106bfbfea0c\\\\UtilityVM"
|
||||||
// },
|
// },
|
||||||
//}
|
//}
|
||||||
func (c *client) Create(_ context.Context, id string, spec *specs.Spec, runtimeOptions interface{}) error {
|
func (c *client) Create(_ context.Context, id string, spec *specs.Spec, runtimeOptions interface{}, opts ...containerd.NewContainerOpts) error {
|
||||||
if ctr := c.getContainer(id); ctr != nil {
|
if ctr := c.getContainer(id); ctr != nil {
|
||||||
return errors.WithStack(errdefs.Conflict(errors.New("id already in use")))
|
return errors.WithStack(errdefs.Conflict(errors.New("id already in use")))
|
||||||
}
|
}
|
||||||
|
|
|
@ -124,15 +124,18 @@ func (c *client) Restore(ctx context.Context, id string, attachStdio libcontaine
|
||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *client) Create(ctx context.Context, id string, ociSpec *specs.Spec, runtimeOptions interface{}) error {
|
func (c *client) Create(ctx context.Context, id string, ociSpec *specs.Spec, runtimeOptions interface{}, opts ...containerd.NewContainerOpts) error {
|
||||||
bdir := c.bundleDir(id)
|
bdir := c.bundleDir(id)
|
||||||
c.logger.WithField("bundle", bdir).WithField("root", ociSpec.Root.Path).Debug("bundle dir created")
|
c.logger.WithField("bundle", bdir).WithField("root", ociSpec.Root.Path).Debug("bundle dir created")
|
||||||
|
|
||||||
_, err := c.client.NewContainer(ctx, id,
|
newOpts := []containerd.NewContainerOpts{
|
||||||
containerd.WithSpec(ociSpec),
|
containerd.WithSpec(ociSpec),
|
||||||
containerd.WithRuntime(runtimeName, runtimeOptions),
|
containerd.WithRuntime(runtimeName, runtimeOptions),
|
||||||
WithBundle(bdir, ociSpec),
|
WithBundle(bdir, ociSpec),
|
||||||
)
|
}
|
||||||
|
opts = append(opts, newOpts...)
|
||||||
|
|
||||||
|
_, err := c.client.NewContainer(ctx, id, opts...)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if containerderrors.IsAlreadyExists(err) {
|
if containerderrors.IsAlreadyExists(err) {
|
||||||
return errors.WithStack(errdefs.Conflict(errors.New("id already in use")))
|
return errors.WithStack(errdefs.Conflict(errors.New("id already in use")))
|
||||||
|
|
|
@ -52,7 +52,7 @@ type Client interface {
|
||||||
|
|
||||||
Restore(ctx context.Context, containerID string, attachStdio StdioCallback) (alive bool, pid int, p Process, err error)
|
Restore(ctx context.Context, containerID string, attachStdio StdioCallback) (alive bool, pid int, p Process, err error)
|
||||||
|
|
||||||
Create(ctx context.Context, containerID string, spec *specs.Spec, runtimeOptions interface{}) error
|
Create(ctx context.Context, containerID string, spec *specs.Spec, runtimeOptions interface{}, opts ...containerd.NewContainerOpts) error
|
||||||
Start(ctx context.Context, containerID, checkpointDir string, withStdin bool, attachStdio StdioCallback) (pid int, err error)
|
Start(ctx context.Context, containerID, checkpointDir string, withStdin bool, attachStdio StdioCallback) (pid int, err error)
|
||||||
SignalProcess(ctx context.Context, containerID, processID string, signal int) error
|
SignalProcess(ctx context.Context, containerID, processID string, signal int) error
|
||||||
Exec(ctx context.Context, containerID, processID string, spec *specs.Process, withStdin bool, attachStdio StdioCallback) (int, error)
|
Exec(ctx context.Context, containerID, processID string, spec *specs.Process, withStdin bool, attachStdio StdioCallback) (int, error)
|
||||||
|
|
Loading…
Reference in a new issue