1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950 |
- 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
- }
- }
|