Quellcode durchsuchen

Use container.Lock in public ToDisk method

Here was possible race with inspect where we changing HostConfig.Links
Docker-DCO-1.1-Signed-off-by: Alexandr Morozov <lk4d4math@gmail.com> (github: LK4D4)
LK4D4 vor 11 Jahren
Ursprung
Commit
eae5cf1e20
1 geänderte Dateien mit 10 neuen und 3 gelöschten Zeilen
  1. 10 3
      daemon/container.go

+ 10 - 3
daemon/container.go

@@ -106,7 +106,7 @@ func (container *Container) FromDisk() error {
 	return container.readHostConfig()
 }
 
-func (container *Container) ToDisk() error {
+func (container *Container) toDisk() error {
 	data, err := json.Marshal(container)
 	if err != nil {
 		return err
@@ -125,6 +125,13 @@ func (container *Container) ToDisk() error {
 	return container.WriteHostConfig()
 }
 
+func (container *Container) ToDisk() error {
+	container.Lock()
+	err := container.toDisk()
+	container.Unlock()
+	return err
+}
+
 func (container *Container) readHostConfig() error {
 	container.hostConfig = &runconfig.HostConfig{}
 	// If the hostconfig file does not exist, do not read it.
@@ -482,7 +489,7 @@ func (container *Container) monitor(callback execdriver.StartCallback) error {
 		// FIXME: here is race condition between two RUN instructions in Dockerfile
 		// because they share same runconfig and change image. Must be fixed
 		// in server/buildfile.go
-		if err := container.ToDisk(); err != nil {
+		if err := container.toDisk(); err != nil {
 			utils.Errorf("Error dumping container %s state to disk: %s\n", container.ID, err)
 		}
 	}
@@ -1081,7 +1088,7 @@ func (container *Container) waitForStart() error {
 				c.Close()
 			}
 		}
-		if err := container.ToDisk(); err != nil {
+		if err := container.toDisk(); err != nil {
 			utils.Debugf("%s", err)
 		}
 		container.State.SetRunning(command.Pid())