2015-10-23 16:57:57 -04:00
|
|
|
// +build linux
|
|
|
|
|
|
|
|
package volume
|
|
|
|
|
|
|
|
import (
|
|
|
|
"strings"
|
2016-08-15 12:13:18 -04:00
|
|
|
|
2016-09-06 14:18:12 -04:00
|
|
|
mounttypes "github.com/docker/docker/api/types/mount"
|
2015-10-23 16:57:57 -04:00
|
|
|
)
|
|
|
|
|
|
|
|
// DefaultPropagationMode defines what propagation mode should be used by
|
|
|
|
// default if user has not specified one explicitly.
|
|
|
|
// propagation modes
|
Add new `HostConfig` field, `Mounts`.
`Mounts` allows users to specify in a much safer way the volumes they
want to use in the container.
This replaces `Binds` and `Volumes`, which both still exist, but
`Mounts` and `Binds`/`Volumes` are exclussive.
The CLI will continue to use `Binds` and `Volumes` due to concerns with
parsing the volume specs on the client side and cross-platform support
(for now).
The new API follows exactly the services mount API.
Example usage of `Mounts`:
```
$ curl -XPOST localhost:2375/containers/create -d '{
"Image": "alpine:latest",
"HostConfig": {
"Mounts": [{
"Type": "Volume",
"Target": "/foo"
},{
"Type": "bind",
"Source": "/var/run/docker.sock",
"Target": "/var/run/docker.sock",
},{
"Type": "volume",
"Name": "important_data",
"Target": "/var/data",
"ReadOnly": true,
"VolumeOptions": {
"DriverConfig": {
Name: "awesomeStorage",
Options: {"size": "10m"},
Labels: {"some":"label"}
}
}]
}
}'
```
There are currently 2 types of mounts:
- **bind**: Paths on the host that get mounted into the
container. Paths must exist prior to creating the container.
- **volume**: Volumes that persist after the
container is removed.
Not all fields are available in each type, and validation is done to
ensure these fields aren't mixed up between types.
Signed-off-by: Brian Goff <cpuguy83@gmail.com>
2016-04-26 14:25:35 -04:00
|
|
|
const DefaultPropagationMode = mounttypes.PropagationRPrivate
|
|
|
|
|
2016-08-15 12:13:18 -04:00
|
|
|
var propagationModes = map[mounttypes.Propagation]bool{
|
|
|
|
mounttypes.PropagationPrivate: true,
|
|
|
|
mounttypes.PropagationRPrivate: true,
|
|
|
|
mounttypes.PropagationSlave: true,
|
|
|
|
mounttypes.PropagationRSlave: true,
|
|
|
|
mounttypes.PropagationShared: true,
|
|
|
|
mounttypes.PropagationRShared: true,
|
2015-10-23 16:57:57 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
// GetPropagation extracts and returns the mount propagation mode. If there
|
|
|
|
// are no specifications, then by default it is "private".
|
2016-08-15 12:13:18 -04:00
|
|
|
func GetPropagation(mode string) mounttypes.Propagation {
|
2015-10-23 16:57:57 -04:00
|
|
|
for _, o := range strings.Split(mode, ",") {
|
2016-08-15 12:13:18 -04:00
|
|
|
prop := mounttypes.Propagation(o)
|
|
|
|
if propagationModes[prop] {
|
|
|
|
return prop
|
2015-10-23 16:57:57 -04:00
|
|
|
}
|
|
|
|
}
|
|
|
|
return DefaultPropagationMode
|
|
|
|
}
|
|
|
|
|
|
|
|
// HasPropagation checks if there is a valid propagation mode present in
|
2016-03-09 11:17:57 -05:00
|
|
|
// passed string. Returns true if a valid propagation mode specifier is
|
2015-10-23 16:57:57 -04:00
|
|
|
// present, false otherwise.
|
|
|
|
func HasPropagation(mode string) bool {
|
|
|
|
for _, o := range strings.Split(mode, ",") {
|
2016-08-15 12:13:18 -04:00
|
|
|
if propagationModes[mounttypes.Propagation(o)] {
|
2015-10-23 16:57:57 -04:00
|
|
|
return true
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return false
|
|
|
|
}
|