2018-02-05 21:05:59 +00:00
|
|
|
package plugin // import "github.com/docker/docker/plugin"
|
2016-09-08 00:01:10 +00:00
|
|
|
|
|
|
|
import (
|
2018-12-27 17:04:10 +00:00
|
|
|
"strings"
|
2016-09-08 00:01:10 +00:00
|
|
|
"sync"
|
|
|
|
|
|
|
|
"github.com/docker/docker/pkg/plugins"
|
2019-08-05 14:37:47 +00:00
|
|
|
v2 "github.com/docker/docker/plugin/v2"
|
|
|
|
specs "github.com/opencontainers/runtime-spec/specs-go"
|
2016-09-08 00:01:10 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
// Store manages the plugin inventory in memory and on-disk
|
|
|
|
type Store struct {
|
|
|
|
sync.RWMutex
|
2017-12-13 20:24:51 +00:00
|
|
|
plugins map[string]*v2.Plugin
|
|
|
|
specOpts map[string][]SpecOpt
|
2016-09-08 00:01:10 +00:00
|
|
|
/* handlers are necessary for transition path of legacy plugins
|
|
|
|
* to the new model. Legacy plugins use Handle() for registering an
|
|
|
|
* activation callback.*/
|
2016-10-15 05:40:28 +00:00
|
|
|
handlers map[string][]func(string, *plugins.Client)
|
2016-09-08 00:01:10 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// NewStore creates a Store.
|
2017-03-17 21:57:23 +00:00
|
|
|
func NewStore() *Store {
|
2016-09-08 00:01:10 +00:00
|
|
|
return &Store{
|
|
|
|
plugins: make(map[string]*v2.Plugin),
|
2017-12-13 20:24:51 +00:00
|
|
|
specOpts: make(map[string][]SpecOpt),
|
2016-10-15 05:40:28 +00:00
|
|
|
handlers: make(map[string][]func(string, *plugins.Client)),
|
2016-09-08 00:01:10 +00:00
|
|
|
}
|
|
|
|
}
|
2017-06-07 17:07:01 +00:00
|
|
|
|
2017-12-13 20:24:51 +00:00
|
|
|
// SpecOpt is used for subsystems that need to modify the runtime spec of a plugin
|
|
|
|
type SpecOpt func(*specs.Spec)
|
|
|
|
|
2017-06-07 17:07:01 +00:00
|
|
|
// CreateOpt is used to configure specific plugin details when created
|
|
|
|
type CreateOpt func(p *v2.Plugin)
|
|
|
|
|
|
|
|
// WithSwarmService is a CreateOpt that flags the passed in a plugin as a plugin
|
|
|
|
// managed by swarm
|
|
|
|
func WithSwarmService(id string) CreateOpt {
|
|
|
|
return func(p *v2.Plugin) {
|
|
|
|
p.SwarmServiceID = id
|
|
|
|
}
|
|
|
|
}
|
2017-12-13 20:24:51 +00:00
|
|
|
|
2018-12-27 17:04:10 +00:00
|
|
|
// WithEnv is a CreateOpt that passes the user-provided environment variables
|
|
|
|
// to the plugin container, de-duplicating variables with the same names case
|
|
|
|
// sensitively and only appends valid key=value pairs
|
|
|
|
func WithEnv(env []string) CreateOpt {
|
|
|
|
return func(p *v2.Plugin) {
|
|
|
|
effectiveEnv := make(map[string]string)
|
|
|
|
for _, penv := range p.PluginObj.Config.Env {
|
|
|
|
if penv.Value != nil {
|
|
|
|
effectiveEnv[penv.Name] = *penv.Value
|
|
|
|
}
|
|
|
|
}
|
|
|
|
for _, line := range env {
|
2022-11-01 11:47:12 +00:00
|
|
|
if k, v, ok := strings.Cut(line, "="); ok {
|
|
|
|
effectiveEnv[k] = v
|
2018-12-27 17:04:10 +00:00
|
|
|
}
|
|
|
|
}
|
2022-11-01 11:47:12 +00:00
|
|
|
p.PluginObj.Settings.Env = make([]string, 0, len(effectiveEnv))
|
2018-12-27 17:04:10 +00:00
|
|
|
for key, value := range effectiveEnv {
|
2022-11-01 11:47:12 +00:00
|
|
|
p.PluginObj.Settings.Env = append(p.PluginObj.Settings.Env, key+"="+value)
|
2018-12-27 17:04:10 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-12-13 20:24:51 +00:00
|
|
|
// WithSpecMounts is a SpecOpt which appends the provided mounts to the runtime spec
|
|
|
|
func WithSpecMounts(mounts []specs.Mount) SpecOpt {
|
|
|
|
return func(s *specs.Spec) {
|
|
|
|
s.Mounts = append(s.Mounts, mounts...)
|
|
|
|
}
|
|
|
|
}
|