add NewContainerOpts to libcontainerd.Create

Signed-off-by: Evan Hazlett <ejhazlett@gmail.com>
This commit is contained in:
Evan Hazlett 2019-04-10 23:00:32 -04:00
parent 92cc603036
commit 35ac4be5d5
5 changed files with 26 additions and 8 deletions

View file

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

View file

@ -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) {

View file

@ -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")))
} }

View file

@ -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")))

View file

@ -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)