github.com/tompao/docker@v1.9.1/daemon/rename.go (about) 1 package daemon 2 3 import ( 4 "github.com/Sirupsen/logrus" 5 derr "github.com/docker/docker/errors" 6 "github.com/docker/libnetwork" 7 "strings" 8 ) 9 10 // ContainerRename changes the name of a container, using the oldName 11 // to find the container. An error is returned if newName is already 12 // reserved. 13 func (daemon *Daemon) ContainerRename(oldName, newName string) error { 14 var ( 15 err error 16 sid string 17 sb libnetwork.Sandbox 18 container *Container 19 ) 20 21 if oldName == "" || newName == "" { 22 return derr.ErrorCodeEmptyRename 23 } 24 25 container, err = daemon.Get(oldName) 26 if err != nil { 27 return err 28 } 29 30 oldName = container.Name 31 32 container.Lock() 33 defer container.Unlock() 34 if newName, err = daemon.reserveName(container.ID, newName); err != nil { 35 return derr.ErrorCodeRenameTaken.WithArgs(err) 36 } 37 38 container.Name = newName 39 40 defer func() { 41 if err != nil { 42 container.Name = oldName 43 daemon.reserveName(container.ID, oldName) 44 daemon.containerGraphDB.Delete(newName) 45 } 46 }() 47 48 if err = daemon.containerGraphDB.Delete(oldName); err != nil { 49 return derr.ErrorCodeRenameDelete.WithArgs(oldName, err) 50 } 51 52 if err = container.toDisk(); err != nil { 53 return err 54 } 55 56 if !container.Running { 57 container.logEvent("rename") 58 return nil 59 } 60 61 defer func() { 62 if err != nil { 63 container.Name = oldName 64 if e := container.toDisk(); e != nil { 65 logrus.Errorf("%s: Failed in writing to Disk on rename failure: %v", container.ID, e) 66 } 67 } 68 }() 69 70 sid = container.NetworkSettings.SandboxID 71 sb, err = daemon.netController.SandboxByID(sid) 72 if err != nil { 73 return err 74 } 75 76 err = sb.Rename(strings.TrimPrefix(container.Name, "/")) 77 if err != nil { 78 return err 79 } 80 81 container.logEvent("rename") 82 return nil 83 }