diff --git a/libcontainer/configs/config.go b/libcontainer/configs/config.go index 12fcf6f6a6c..4b298e1eae3 100644 --- a/libcontainer/configs/config.go +++ b/libcontainer/configs/config.go @@ -173,6 +173,9 @@ type Config struct { // Hooks are a collection of actions to perform at various container lifecycle events. // Hooks are not able to be marshaled to json but they are also not needed to. Hooks *Hooks `json:"-"` + + // Version is the version of opencontainer specification that is supported. + Version string `json:"version"` } type Hooks struct { @@ -186,9 +189,10 @@ type Hooks struct { // HookState is the payload provided to a hook on execution. type HookState struct { - ID string `json:"id"` - Pid int `json:"pid"` - Root string `json:"root"` + Version string `json:"version"` + ID string `json:"id"` + Pid int `json:"pid"` + Root string `json:"root"` } type Hook interface { diff --git a/libcontainer/container_linux.go b/libcontainer/container_linux.go index 153c237d327..853aedf4dde 100644 --- a/libcontainer/container_linux.go +++ b/libcontainer/container_linux.go @@ -250,8 +250,9 @@ func (c *linuxContainer) Destroy() error { c.initProcess = nil if c.config.Hooks != nil { s := configs.HookState{ - ID: c.id, - Root: c.config.Rootfs, + Version: c.config.Version, + ID: c.id, + Root: c.config.Rootfs, } for _, hook := range c.config.Hooks.Poststop { if err := hook.Run(s); err != nil { diff --git a/libcontainer/process_linux.go b/libcontainer/process_linux.go index f191c16ee29..0072e194834 100644 --- a/libcontainer/process_linux.go +++ b/libcontainer/process_linux.go @@ -203,9 +203,10 @@ func (p *initProcess) start() (err error) { }() if p.config.Config.Hooks != nil { s := configs.HookState{ - ID: p.container.id, - Pid: p.pid(), - Root: p.config.Config.Rootfs, + Version: p.container.config.Version, + ID: p.container.id, + Pid: p.pid(), + Root: p.config.Config.Rootfs, } for _, hook := range p.config.Config.Hooks.Prestart { if err := hook.Run(s); err != nil { diff --git a/spec.go b/spec.go index a27f678235f..8604121bd36 100644 --- a/spec.go +++ b/spec.go @@ -391,6 +391,8 @@ func createLibcontainerConfig(cgroupName string, spec *specs.LinuxSpec, rspec *s config.Sysctl = rspec.Linux.Sysctl config.ProcessLabel = rspec.Linux.SelinuxProcessLabel config.AppArmorProfile = rspec.Linux.ApparmorProfile + createHooks(rspec, config) + config.Version = specs.Version return config, nil } @@ -653,3 +655,23 @@ func setupSeccomp(config *specs.Seccomp) (*configs.Seccomp, error) { return newConfig, nil } + +func createHooks(rspec *specs.LinuxRuntimeSpec, config *configs.Config) { + config.Hooks = &configs.Hooks{} + for _, h := range rspec.Hooks.Prestart { + cmd := configs.Command{ + Path: h.Path, + Args: h.Args, + Env: h.Env, + } + config.Hooks.Prestart = append(config.Hooks.Prestart, configs.NewCommandHook(cmd)) + } + for _, h := range rspec.Hooks.Poststop { + cmd := configs.Command{ + Path: h.Path, + Args: h.Args, + Env: h.Env, + } + config.Hooks.Poststop = append(config.Hooks.Poststop, configs.NewCommandHook(cmd)) + } +}