Skip to content

Commit 10fcd30

Browse files
authored
Merge pull request moby#24020 from yongtang/23973-rename-with-linked-container
Fix docker rename with linked containers
2 parents a71033f + 3f6e3a0 commit 10fcd30

File tree

2 files changed

+36
-0
lines changed

2 files changed

+36
-0
lines changed

daemon/rename.go

+24
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55
"strings"
66

77
"github.com/Sirupsen/logrus"
8+
dockercontainer "github.com/docker/docker/container"
89
"github.com/docker/libnetwork"
910
)
1011

@@ -40,10 +41,23 @@ func (daemon *Daemon) ContainerRename(oldName, newName string) error {
4041
container.Lock()
4142
defer container.Unlock()
4243

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+
4352
if newName, err = daemon.reserveName(container.ID, newName); err != nil {
4453
return fmt.Errorf("Error when allocating new name: %v", err)
4554
}
4655

56+
for k, v := range links {
57+
daemon.nameIndex.Reserve(newName+k, v.ID)
58+
daemon.linkIndex.link(container, v, newName+k)
59+
}
60+
4761
container.Name = newName
4862
container.NetworkSettings.IsAnonymousEndpoint = false
4963

@@ -52,10 +66,20 @@ func (daemon *Daemon) ContainerRename(oldName, newName string) error {
5266
container.Name = oldName
5367
container.NetworkSettings.IsAnonymousEndpoint = oldIsAnonymousEndpoint
5468
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+
}
5575
daemon.releaseName(newName)
5676
}
5777
}()
5878

79+
for k, v := range links {
80+
daemon.linkIndex.unlink(oldName+k, v, container)
81+
daemon.nameIndex.Release(oldName + k)
82+
}
5983
daemon.releaseName(oldName)
6084
if err = container.ToDisk(); err != nil {
6185
return err

integration-cli/docker_cli_rename_test.go

+12
Original file line numberDiff line numberDiff line change
@@ -121,3 +121,15 @@ func (s *DockerSuite) TestRenameContainerWithSameName(c *check.C) {
121121
c.Assert(err, checker.NotNil, check.Commentf("Renaming a container with the same name should have failed"))
122122
c.Assert(out, checker.Contains, "Renaming a container with the same name", check.Commentf("%v", err))
123123
}
124+
125+
// Test case for #23973
126+
func (s *DockerSuite) TestRenameContainerWithLinkedContainer(c *check.C) {
127+
testRequires(c, DaemonIsLinux)
128+
129+
db1, _ := dockerCmd(c, "run", "--name", "db1", "-d", "busybox", "top")
130+
dockerCmd(c, "run", "--name", "app1", "-d", "--link", "db1:/mysql", "busybox", "top")
131+
dockerCmd(c, "rename", "app1", "app2")
132+
out, _, err := dockerCmdWithError("inspect", "--format='{{ .Id }}'", "app2/mysql")
133+
c.Assert(err, checker.IsNil)
134+
c.Assert(strings.TrimSpace(out), checker.Equals, strings.TrimSpace(db1))
135+
}

0 commit comments

Comments
 (0)