فهرست منبع

add NewContainerOpts to libcontainerd.Create

Signed-off-by: Evan Hazlett <ejhazlett@gmail.com>
Evan Hazlett 6 سال پیش
والد
کامیت
35ac4be5d5
5فایلهای تغییر یافته به همراه26 افزوده شده و 8 حذف شده
  1. 17 2
      daemon/start.go
  2. 1 1
      daemon/util_test.go
  3. 1 1
      libcontainerd/local/local_windows.go
  4. 6 3
      libcontainerd/remote/client.go
  5. 1 1
      libcontainerd/types/types.go

+ 17 - 2
daemon/start.go

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

+ 1 - 1
daemon/util_test.go

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

+ 1 - 1
libcontainerd/local/local_windows.go

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

+ 6 - 3
libcontainerd/remote/client.go

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

+ 1 - 1
libcontainerd/types/types.go

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