5
5
"strings"
6
6
7
7
"github.com/Sirupsen/logrus"
8
+ dockercontainer "github.com/docker/docker/container"
8
9
"github.com/docker/libnetwork"
9
10
)
10
11
@@ -40,10 +41,23 @@ func (daemon *Daemon) ContainerRename(oldName, newName string) error {
40
41
container .Lock ()
41
42
defer container .Unlock ()
42
43
44
+ links := map [string ]* dockercontainer.Container {}
45
+ for k , v := range daemon .linkIndex .children (container ) {
46
+ if ! strings .HasPrefix (k , oldName ) {
47
+ return fmt .Errorf ("Linked container %s does not match parent %s" , k , oldName )
48
+ }
49
+ links [strings .TrimPrefix (k , oldName )] = v
50
+ }
51
+
43
52
if newName , err = daemon .reserveName (container .ID , newName ); err != nil {
44
53
return fmt .Errorf ("Error when allocating new name: %v" , err )
45
54
}
46
55
56
+ for k , v := range links {
57
+ daemon .nameIndex .Reserve (newName + k , v .ID )
58
+ daemon .linkIndex .link (container , v , newName + k )
59
+ }
60
+
47
61
container .Name = newName
48
62
container .NetworkSettings .IsAnonymousEndpoint = false
49
63
@@ -52,10 +66,20 @@ func (daemon *Daemon) ContainerRename(oldName, newName string) error {
52
66
container .Name = oldName
53
67
container .NetworkSettings .IsAnonymousEndpoint = oldIsAnonymousEndpoint
54
68
daemon .reserveName (container .ID , oldName )
69
+ for k , v := range links {
70
+ daemon .nameIndex .Reserve (oldName + k , v .ID )
71
+ daemon .linkIndex .link (container , v , oldName + k )
72
+ daemon .linkIndex .unlink (newName + k , v , container )
73
+ daemon .nameIndex .Release (newName + k )
74
+ }
55
75
daemon .releaseName (newName )
56
76
}
57
77
}()
58
78
79
+ for k , v := range links {
80
+ daemon .linkIndex .unlink (oldName + k , v , container )
81
+ daemon .nameIndex .Release (oldName + k )
82
+ }
59
83
daemon .releaseName (oldName )
60
84
if err = container .ToDisk (); err != nil {
61
85
return err
0 commit comments