2015-11-20 17:35:16 -05:00
|
|
|
package exec
|
|
|
|
|
|
|
|
import (
|
|
|
|
"sync"
|
|
|
|
|
|
|
|
"github.com/docker/docker/pkg/stringid"
|
|
|
|
"github.com/docker/docker/runconfig"
|
|
|
|
)
|
|
|
|
|
|
|
|
// Config holds the configurations for execs. The Daemon keeps
|
|
|
|
// track of both running and finished execs so that they can be
|
|
|
|
// examined both during and after completion.
|
|
|
|
type Config struct {
|
|
|
|
sync.Mutex
|
|
|
|
*runconfig.StreamConfig
|
2016-03-18 14:50:19 -04:00
|
|
|
ID string
|
|
|
|
Running bool
|
|
|
|
ExitCode *int
|
|
|
|
OpenStdin bool
|
|
|
|
OpenStderr bool
|
|
|
|
OpenStdout bool
|
|
|
|
CanRemove bool
|
|
|
|
ContainerID string
|
|
|
|
DetachKeys []byte
|
|
|
|
Entrypoint string
|
|
|
|
Args []string
|
|
|
|
Tty bool
|
|
|
|
Privileged bool
|
|
|
|
User string
|
2016-09-09 19:50:54 -04:00
|
|
|
Env []string
|
2015-11-20 17:35:16 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
// NewConfig initializes the a new exec configuration
|
|
|
|
func NewConfig() *Config {
|
|
|
|
return &Config{
|
|
|
|
ID: stringid.GenerateNonCryptoID(),
|
|
|
|
StreamConfig: runconfig.NewStreamConfig(),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Store keeps track of the exec configurations.
|
|
|
|
type Store struct {
|
|
|
|
commands map[string]*Config
|
|
|
|
sync.RWMutex
|
|
|
|
}
|
|
|
|
|
|
|
|
// NewStore initializes a new exec store.
|
|
|
|
func NewStore() *Store {
|
|
|
|
return &Store{commands: make(map[string]*Config, 0)}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Commands returns the exec configurations in the store.
|
|
|
|
func (e *Store) Commands() map[string]*Config {
|
2016-01-19 07:30:48 -05:00
|
|
|
e.RLock()
|
|
|
|
commands := make(map[string]*Config, len(e.commands))
|
|
|
|
for id, config := range e.commands {
|
|
|
|
commands[id] = config
|
|
|
|
}
|
|
|
|
e.RUnlock()
|
|
|
|
return commands
|
2015-11-20 17:35:16 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
// Add adds a new exec configuration to the store.
|
|
|
|
func (e *Store) Add(id string, Config *Config) {
|
|
|
|
e.Lock()
|
|
|
|
e.commands[id] = Config
|
|
|
|
e.Unlock()
|
|
|
|
}
|
|
|
|
|
|
|
|
// Get returns an exec configuration by its id.
|
|
|
|
func (e *Store) Get(id string) *Config {
|
|
|
|
e.RLock()
|
|
|
|
res := e.commands[id]
|
|
|
|
e.RUnlock()
|
|
|
|
return res
|
|
|
|
}
|
|
|
|
|
|
|
|
// Delete removes an exec configuration from the store.
|
|
|
|
func (e *Store) Delete(id string) {
|
|
|
|
e.Lock()
|
|
|
|
delete(e.commands, id)
|
|
|
|
e.Unlock()
|
|
|
|
}
|
|
|
|
|
|
|
|
// List returns the list of exec ids in the store.
|
|
|
|
func (e *Store) List() []string {
|
|
|
|
var IDs []string
|
|
|
|
e.RLock()
|
|
|
|
for id := range e.commands {
|
|
|
|
IDs = append(IDs, id)
|
|
|
|
}
|
|
|
|
e.RUnlock()
|
|
|
|
return IDs
|
|
|
|
}
|