github.com/jingleWang/moby@v1.13.1/container/monitor.go (about) 1 package container 2 3 import ( 4 "time" 5 6 "github.com/Sirupsen/logrus" 7 ) 8 9 const ( 10 loggerCloseTimeout = 10 * time.Second 11 ) 12 13 // Reset puts a container into a state where it can be restarted again. 14 func (container *Container) Reset(lock bool) { 15 if lock { 16 container.Lock() 17 defer container.Unlock() 18 } 19 20 if err := container.CloseStreams(); err != nil { 21 logrus.Errorf("%s: %s", container.ID, err) 22 } 23 24 // Re-create a brand new stdin pipe once the container exited 25 if container.Config.OpenStdin { 26 container.StreamConfig.NewInputPipes() 27 } 28 29 if container.LogDriver != nil { 30 if container.LogCopier != nil { 31 exit := make(chan struct{}) 32 go func() { 33 container.LogCopier.Wait() 34 close(exit) 35 }() 36 select { 37 case <-time.After(loggerCloseTimeout): 38 logrus.Warn("Logger didn't exit in time: logs may be truncated") 39 case <-exit: 40 } 41 } 42 container.LogDriver.Close() 43 container.LogCopier = nil 44 container.LogDriver = nil 45 } 46 }