|
@@ -48,6 +48,7 @@ import (
|
|
|
"github.com/docker/docker/pkg/archive"
|
|
|
"github.com/docker/docker/pkg/discovery"
|
|
|
"github.com/docker/docker/pkg/fileutils"
|
|
|
+ "github.com/docker/docker/pkg/graphdb"
|
|
|
"github.com/docker/docker/pkg/idtools"
|
|
|
"github.com/docker/docker/pkg/mount"
|
|
|
"github.com/docker/docker/pkg/namesgenerator"
|
|
@@ -331,6 +332,7 @@ func (daemon *Daemon) restore() error {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ var migrateLegacyLinks bool
|
|
|
restartContainers := make(map[*container.Container]chan struct{})
|
|
|
for _, c := range containers {
|
|
|
if err := daemon.registerName(c); err != nil {
|
|
@@ -346,10 +348,31 @@ func (daemon *Daemon) restore() error {
|
|
|
if daemon.configStore.AutoRestart && c.ShouldRestart() {
|
|
|
restartContainers[c] = make(chan struct{})
|
|
|
}
|
|
|
+
|
|
|
+ // if c.hostConfig.Links is nil (not just empty), then it is using the old sqlite links and needs to be migrated
|
|
|
+ if c.HostConfig != nil && c.HostConfig.Links == nil {
|
|
|
+ migrateLegacyLinks = true
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // migrate any legacy links from sqlite
|
|
|
+ linkdbFile := filepath.Join(daemon.root, "linkgraph.db")
|
|
|
+ var legacyLinkDB *graphdb.Database
|
|
|
+ if migrateLegacyLinks {
|
|
|
+ legacyLinkDB, err = graphdb.NewSqliteConn(linkdbFile)
|
|
|
+ if err != nil {
|
|
|
+ return fmt.Errorf("error connecting to legacy link graph DB %s, container links may be lost: %v", linkdbFile, err)
|
|
|
+ }
|
|
|
+ defer legacyLinkDB.Close()
|
|
|
}
|
|
|
|
|
|
// Now that all the containers are registered, register the links
|
|
|
for _, c := range containers {
|
|
|
+ if migrateLegacyLinks {
|
|
|
+ if err := daemon.migrateLegacySqliteLinks(legacyLinkDB, c); err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ }
|
|
|
if err := daemon.registerLinks(c, c.HostConfig); err != nil {
|
|
|
logrus.Errorf("failed to register link for container %s: %v", c.ID, err)
|
|
|
}
|
|
@@ -1359,6 +1382,12 @@ func (daemon *Daemon) setHostConfig(container *container.Container, hostConfig *
|
|
|
return err
|
|
|
}
|
|
|
|
|
|
+ // make sure links is not nil
|
|
|
+ // this ensures that on the next daemon restart we don't try to migrate from legacy sqlite links
|
|
|
+ if hostConfig.Links == nil {
|
|
|
+ hostConfig.Links = []string{}
|
|
|
+ }
|
|
|
+
|
|
|
container.HostConfig = hostConfig
|
|
|
return container.ToDisk()
|
|
|
}
|