Currently the metrics plugin uses a really hackish host mount with propagated mounts to get the metrics socket into a plugin after the plugin is alreay running. This approach ends up leaking mounts which requires setting the plugin manager root to private, which causes some other issues. With this change, plugin subsystems can register a set of modifiers to apply to the plugin's runtime spec before the plugin is ever started. This will help to generalize some of the customization work that needs to happen for various plugin subsystems (and future ones). Specifically it lets the metrics plugin subsystem append a mount to the runtime spec to mount the metrics socket in the plugin's mount namespace rather than the host's and prevetns any leaking due to this mount. Signed-off-by: Brian Goff <cpuguy83@gmail.com> Upstream-commit: 426e610e43179d58b29c496bc79a53f410a4b1e1 Component: engine
51 lines
1.4 KiB
Go
51 lines
1.4 KiB
Go
package plugin
|
|
|
|
import (
|
|
"sync"
|
|
|
|
"github.com/docker/docker/pkg/plugins"
|
|
"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
|
|
}
|
|
}
|
|
|
|
// 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...)
|
|
}
|
|
}
|