github.com/psychoss/docker@v1.9.0/daemon/create_unix.go (about)

     1  // +build !windows
     2  
     3  package daemon
     4  
     5  import (
     6  	"os"
     7  	"path/filepath"
     8  
     9  	derr "github.com/docker/docker/errors"
    10  	"github.com/docker/docker/image"
    11  	"github.com/docker/docker/pkg/stringid"
    12  	"github.com/docker/docker/runconfig"
    13  	"github.com/docker/docker/volume"
    14  	"github.com/opencontainers/runc/libcontainer/label"
    15  )
    16  
    17  // createContainerPlatformSpecificSettings performs platform specific container create functionality
    18  func createContainerPlatformSpecificSettings(container *Container, config *runconfig.Config, hostConfig *runconfig.HostConfig, img *image.Image) error {
    19  	for spec := range config.Volumes {
    20  		name := stringid.GenerateNonCryptoID()
    21  		destination := filepath.Clean(spec)
    22  
    23  		// Skip volumes for which we already have something mounted on that
    24  		// destination because of a --volume-from.
    25  		if container.isDestinationMounted(destination) {
    26  			continue
    27  		}
    28  		path, err := container.GetResourcePath(destination)
    29  		if err != nil {
    30  			return err
    31  		}
    32  
    33  		stat, err := os.Stat(path)
    34  		if err == nil && !stat.IsDir() {
    35  			return derr.ErrorCodeMountOverFile.WithArgs(path)
    36  		}
    37  
    38  		volumeDriver := hostConfig.VolumeDriver
    39  		if destination != "" && img != nil {
    40  			if _, ok := img.ContainerConfig.Volumes[destination]; ok {
    41  				// check for whether bind is not specified and then set to local
    42  				if _, ok := container.MountPoints[destination]; !ok {
    43  					volumeDriver = volume.DefaultDriverName
    44  				}
    45  			}
    46  		}
    47  
    48  		v, err := container.daemon.createVolume(name, volumeDriver, nil)
    49  		if err != nil {
    50  			return err
    51  		}
    52  
    53  		if err := label.Relabel(v.Path(), container.MountLabel, true); err != nil {
    54  			return err
    55  		}
    56  
    57  		// never attempt to copy existing content in a container FS to a shared volume
    58  		if v.DriverName() == volume.DefaultDriverName {
    59  			if err := container.copyImagePathContent(v, destination); err != nil {
    60  				return err
    61  			}
    62  		}
    63  
    64  		container.addMountPointWithVolume(destination, v, true)
    65  	}
    66  	return nil
    67  }