From 76d96418b13080514f3fb861072b06cb91d71cff Mon Sep 17 00:00:00 2001 From: Fabio Kung Date: Mon, 10 Apr 2017 09:54:29 -0700 Subject: [PATCH] avoid saving container state to disk before daemon.Register Migrate legacy volumes (Daemon.verifyVolumesInfo) before containers are registered on the Daemon, so state on disk is not overwritten and legacy fields lost during registration. Signed-off-by: Fabio Kung --- daemon/daemon.go | 11 +++++------ daemon/daemon_unix_test.go | 11 +++-------- daemon/volumes_unix.go | 1 - integration-cli/docker_cli_daemon_test.go | 2 +- 4 files changed, 9 insertions(+), 16 deletions(-) diff --git a/daemon/daemon.go b/daemon/daemon.go index 6f4ac26ac2..ff40bdbe90 100644 --- a/daemon/daemon.go +++ b/daemon/daemon.go @@ -187,17 +187,16 @@ func (daemon *Daemon) restore() error { delete(containers, id) continue } - if err := daemon.Register(c); err != nil { - logrus.Errorf("Failed to register container %s: %s", c.ID, err) - delete(containers, id) - continue - } - // verify that all volumes valid and have been migrated from the pre-1.7 layout if err := daemon.verifyVolumesInfo(c); err != nil { // don't skip the container due to error logrus.Errorf("Failed to verify volumes for container '%s': %v", c.ID, err) } + if err := daemon.Register(c); err != nil { + logrus.Errorf("Failed to register container %s: %s", c.ID, err) + delete(containers, id) + continue + } // The LogConfig.Type is empty if the container was created before docker 1.12 with default log driver. // We should rewrite it to use the daemon defaults. diff --git a/daemon/daemon_unix_test.go b/daemon/daemon_unix_test.go index eb19376845..c3aa443e45 100644 --- a/daemon/daemon_unix_test.go +++ b/daemon/daemon_unix_test.go @@ -274,10 +274,6 @@ func TestMigratePre17Volumes(t *testing.T) { } `) - viewDB, err := container.NewViewDB() - if err != nil { - t.Fatal(err) - } volStore, err := store.New(volumeRoot) if err != nil { t.Fatal(err) @@ -289,10 +285,9 @@ func TestMigratePre17Volumes(t *testing.T) { volumedrivers.Register(drv, volume.DefaultDriverName) daemon := &Daemon{ - root: rootDir, - repository: containerRoot, - containersReplica: viewDB, - volumes: volStore, + root: rootDir, + repository: containerRoot, + volumes: volStore, } err = ioutil.WriteFile(filepath.Join(containerRoot, cid, "config.v2.json"), config, 600) if err != nil { diff --git a/daemon/volumes_unix.go b/daemon/volumes_unix.go index d6b48d381b..0a4cbf8493 100644 --- a/daemon/volumes_unix.go +++ b/daemon/volumes_unix.go @@ -180,7 +180,6 @@ func (daemon *Daemon) verifyVolumesInfo(container *container.Container) error { container.MountPoints[destination] = &m } } - return container.CheckpointTo(daemon.containersReplica) } return nil } diff --git a/integration-cli/docker_cli_daemon_test.go b/integration-cli/docker_cli_daemon_test.go index 4ec5ac230d..849820aa14 100644 --- a/integration-cli/docker_cli_daemon_test.go +++ b/integration-cli/docker_cli_daemon_test.go @@ -2684,7 +2684,7 @@ func (s *DockerDaemonSuite) TestDaemonBackcompatPre17Volumes(c *check.C) { `) configPath := filepath.Join(d.Root, "containers", id, "config.v2.json") - err = ioutil.WriteFile(configPath, config, 600) + c.Assert(ioutil.WriteFile(configPath, config, 600), checker.IsNil) d.Start(c) out, err = d.Cmd("inspect", "--type=container", "--format={{ json .Mounts }}", id)