示例#1
0
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
}
示例#2
0
// 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
}