Allow volumes from to be individual files

Fixes #4741
Right now volumes from expected a dir and not a file so when the drivers
 tried to do the bind mount, the destination was a dir, not a file so it
 fails to run.
Docker-DCO-1.1-Signed-off-by: Michael Crosby <michael@crosbymichael.com> (github: crosbymichael)
This commit is contained in:
Michael Crosby 2014-03-18 15:28:40 -07:00
parent 7727c817fb
commit a57900e35f
1 changed files with 29 additions and 19 deletions

View File

@ -88,7 +88,11 @@ func applyVolumesFrom(container *Container) error {
if _, exists := container.Volumes[volPath]; exists { if _, exists := container.Volumes[volPath]; exists {
continue continue
} }
if err := os.MkdirAll(filepath.Join(container.basefs, volPath), 0755); err != nil { stat, err := os.Stat(filepath.Join(c.basefs, volPath))
if err != nil {
return err
}
if err := createIfNotExists(filepath.Join(container.basefs, volPath), stat.IsDir()); err != nil {
return err return err
} }
container.Volumes[volPath] = id container.Volumes[volPath] = id
@ -208,25 +212,9 @@ func createVolumes(container *Container) error {
if err != nil { if err != nil {
return err return err
} }
if err := createIfNotExists(rootVolPath, volIsDir); err != nil {
if _, err := os.Stat(rootVolPath); err != nil {
if os.IsNotExist(err) {
if volIsDir {
if err := os.MkdirAll(rootVolPath, 0755); err != nil {
return err return err
} }
} else {
if err := os.MkdirAll(filepath.Dir(rootVolPath), 0755); err != nil {
return err
}
if f, err := os.OpenFile(rootVolPath, os.O_CREATE, 0755); err != nil {
return err
} else {
f.Close()
}
}
}
}
// Do not copy or change permissions if we are mounting from the host // Do not copy or change permissions if we are mounting from the host
if srcRW && !isBindMount { if srcRW && !isBindMount {
@ -266,3 +254,25 @@ func createVolumes(container *Container) error {
} }
return nil return nil
} }
func createIfNotExists(path string, isDir bool) error {
if _, err := os.Stat(path); err != nil {
if os.IsNotExist(err) {
if isDir {
if err := os.MkdirAll(path, 0755); err != nil {
return err
}
} else {
if err := os.MkdirAll(filepath.Dir(path), 0755); err != nil {
return err
}
f, err := os.OpenFile(path, os.O_CREATE, 0755)
if err != nil {
return err
}
defer f.Close()
}
}
}
return nil
}