package container // import "github.com/docker/docker/container" import ( "context" "time" "github.com/containerd/log" ) const ( loggerCloseTimeout = 10 * time.Second ) // Reset puts a container into a state where it can be restarted again. func (container *Container) Reset(lock bool) { if lock { container.Lock() defer container.Unlock() } if err := container.CloseStreams(); err != nil { log.G(context.TODO()).Errorf("%s: %s", container.ID, err) } // Re-create a brand new stdin pipe once the container exited if container.Config.OpenStdin { container.StreamConfig.NewInputPipes() } if container.LogDriver != nil { if container.LogCopier != nil { exit := make(chan struct{}) go func() { container.LogCopier.Wait() close(exit) }() timer := time.NewTimer(loggerCloseTimeout) defer timer.Stop() select { case <-timer.C: log.G(context.TODO()).Warn("Logger didn't exit in time: logs may be truncated") case <-exit: } } container.LogDriver.Close() container.LogCopier = nil container.LogDriver = nil } }