func addHooks(c *container.Container, spec *specs.Spec) error { prestart, err := loadHooks(prestartDir) if err != nil { return err } poststart, err := loadHooks(poststartDir) if err != nil { return err } poststop, err := loadHooks(poststopDir) if err != nil { return err } configPath, err := c.ConfigPath() if err != nil { return errors.Wrap(err, "config path") } hostConfigPath, err := c.HostConfigPath() if err != nil { return errors.Wrap(err, "host config path") } spec.Hooks.Prestart = appendHooksForContainer(configPath, hostConfigPath, c, prestart) spec.Hooks.Poststart = appendHooksForContainer(configPath, hostConfigPath, c, poststart) spec.Hooks.Poststop = appendHooksForContainer(configPath, hostConfigPath, c, poststop) return nil }
// verifyVolumesInfo ports volumes configured for the containers pre docker 1.7. // It reads the container configuration and creates valid mount points for the old volumes. func (daemon *Daemon) verifyVolumesInfo(container *container.Container) error { // Inspect old structures only when we're upgrading from old versions // to versions >= 1.7 and the MountPoints has not been populated with volumes data. type volumes struct { Volumes map[string]string VolumesRW map[string]bool } cfgPath, err := container.ConfigPath() if err != nil { return err } f, err := os.Open(cfgPath) if err != nil { return errors.Wrap(err, "could not open container config") } defer f.Close() var cv volumes if err := json.NewDecoder(f).Decode(&cv); err != nil { return errors.Wrap(err, "could not decode container config") } if len(container.MountPoints) == 0 && len(cv.Volumes) > 0 { for destination, hostPath := range cv.Volumes { vfsPath := filepath.Join(daemon.root, "vfs", "dir") rw := cv.VolumesRW != nil && cv.VolumesRW[destination] if strings.HasPrefix(hostPath, vfsPath) { id := filepath.Base(hostPath) v, err := daemon.volumes.CreateWithRef(id, volume.DefaultDriverName, container.ID, nil, nil) if err != nil { return err } if err := migrateVolume(id, hostPath); err != nil { return err } container.AddMountPointWithVolume(destination, v, true) } else { // Bind mount m := volume.MountPoint{Source: hostPath, Destination: destination, RW: rw} container.MountPoints[destination] = &m } } return container.ToDisk() } return nil }