Fixes #11315
After rename occured the graphdb was updated but the container struct
was never commited back to disk, so on daemon restart it loads the old
name again.
Signed-off-by: Brian Goff <cpuguy83@gmail.com>
... | ... |
@@ -1,8 +1,6 @@ |
1 | 1 |
package daemon |
2 | 2 |
|
3 |
-import ( |
|
4 |
- "github.com/docker/docker/engine" |
|
5 |
-) |
|
3 |
+import "github.com/docker/docker/engine" |
|
6 | 4 |
|
7 | 5 |
func (daemon *Daemon) ContainerRename(job *engine.Job) engine.Status { |
8 | 6 |
if len(job.Args) != 2 { |
... | ... |
@@ -26,9 +24,21 @@ func (daemon *Daemon) ContainerRename(job *engine.Job) engine.Status { |
26 | 26 |
|
27 | 27 |
container.Name = newName |
28 | 28 |
|
29 |
+ undo := func() { |
|
30 |
+ container.Name = oldName |
|
31 |
+ daemon.reserveName(container.ID, oldName) |
|
32 |
+ daemon.containerGraph.Delete(newName) |
|
33 |
+ } |
|
34 |
+ |
|
29 | 35 |
if err := daemon.containerGraph.Delete(oldName); err != nil { |
36 |
+ undo() |
|
30 | 37 |
return job.Errorf("Failed to delete container %q: %v", oldName, err) |
31 | 38 |
} |
32 | 39 |
|
40 |
+ if err := container.toDisk(); err != nil { |
|
41 |
+ undo() |
|
42 |
+ return job.Error(err) |
|
43 |
+ } |
|
44 |
+ |
|
33 | 45 |
return engine.StatusOK |
34 | 46 |
} |
... | ... |
@@ -534,3 +534,29 @@ func TestDaemonUlimitDefaults(t *testing.T) { |
534 | 534 |
|
535 | 535 |
logDone("daemon - default ulimits are applied") |
536 | 536 |
} |
537 |
+ |
|
538 |
+// #11315 |
|
539 |
+func TestDaemonRestartRenameContainer(t *testing.T) { |
|
540 |
+ d := NewDaemon(t) |
|
541 |
+ if err := d.StartWithBusybox(); err != nil { |
|
542 |
+ t.Fatal(err) |
|
543 |
+ } |
|
544 |
+ |
|
545 |
+ if out, err := d.Cmd("run", "--name=test", "busybox"); err != nil { |
|
546 |
+ t.Fatal(err, out) |
|
547 |
+ } |
|
548 |
+ |
|
549 |
+ if out, err := d.Cmd("rename", "test", "test2"); err != nil { |
|
550 |
+ t.Fatal(err, out) |
|
551 |
+ } |
|
552 |
+ |
|
553 |
+ if err := d.Restart(); err != nil { |
|
554 |
+ t.Fatal(err) |
|
555 |
+ } |
|
556 |
+ |
|
557 |
+ if out, err := d.Cmd("start", "test2"); err != nil { |
|
558 |
+ t.Fatal(err, out) |
|
559 |
+ } |
|
560 |
+ |
|
561 |
+ logDone("daemon - rename persists through daemon restart") |
|
562 |
+} |