1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374 |
- package plugin // import "github.com/docker/docker/plugin"
- import (
- "strings"
- "sync"
- "github.com/docker/docker/pkg/plugins"
- v2 "github.com/docker/docker/plugin/v2"
- specs "github.com/opencontainers/runtime-spec/specs-go"
- )
- // Store manages the plugin inventory in memory and on-disk
- type Store struct {
- sync.RWMutex
- plugins map[string]*v2.Plugin
- specOpts map[string][]SpecOpt
- /* handlers are necessary for transition path of legacy plugins
- * to the new model. Legacy plugins use Handle() for registering an
- * activation callback.*/
- handlers map[string][]func(string, *plugins.Client)
- }
- // NewStore creates a Store.
- func NewStore() *Store {
- return &Store{
- plugins: make(map[string]*v2.Plugin),
- specOpts: make(map[string][]SpecOpt),
- handlers: make(map[string][]func(string, *plugins.Client)),
- }
- }
- // SpecOpt is used for subsystems that need to modify the runtime spec of a plugin
- type SpecOpt func(*specs.Spec)
- // 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
- }
- }
- // 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 {
- if k, v, ok := strings.Cut(line, "="); ok {
- effectiveEnv[k] = v
- }
- }
- p.PluginObj.Settings.Env = make([]string, 0, len(effectiveEnv))
- for key, value := range effectiveEnv {
- p.PluginObj.Settings.Env = append(p.PluginObj.Settings.Env, key+"="+value)
- }
- }
- }
- // 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...)
- }
- }
|