add --mount option to ctr
Signed-off-by: Evan Hazlett <ejhazlett@gmail.com>
This commit is contained in:
parent
e4bb820b55
commit
ef026e83fa
@ -54,6 +54,10 @@ var runCommand = cli.Command{
|
|||||||
Name: "net-host",
|
Name: "net-host",
|
||||||
Usage: "enable host networking for the container",
|
Usage: "enable host networking for the container",
|
||||||
},
|
},
|
||||||
|
cli.StringSliceFlag{
|
||||||
|
Name: "mount",
|
||||||
|
Usage: "specify additional container mount (ex: type=bind,src=/tmp,dest=/host,options=rbind:ro)",
|
||||||
|
},
|
||||||
cli.BoolFlag{
|
cli.BoolFlag{
|
||||||
Name: "keep",
|
Name: "keep",
|
||||||
Usage: "keep container after running",
|
Usage: "keep container after running",
|
||||||
|
@ -222,6 +222,14 @@ func spec(id string, config *ocispec.ImageConfig, context *cli.Context, rootfs s
|
|||||||
Type: "network",
|
Type: "network",
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
for _, mount := range context.StringSlice("mount") {
|
||||||
|
m, err := parseMountFlag(mount)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
s.Mounts = append(s.Mounts, m)
|
||||||
|
}
|
||||||
return s, nil
|
return s, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2,6 +2,7 @@ package main
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
gocontext "context"
|
gocontext "context"
|
||||||
|
"encoding/csv"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"os"
|
"os"
|
||||||
@ -26,6 +27,7 @@ import (
|
|||||||
imagesservice "github.com/containerd/containerd/services/images"
|
imagesservice "github.com/containerd/containerd/services/images"
|
||||||
snapshotservice "github.com/containerd/containerd/services/snapshot"
|
snapshotservice "github.com/containerd/containerd/services/snapshot"
|
||||||
"github.com/containerd/containerd/snapshot"
|
"github.com/containerd/containerd/snapshot"
|
||||||
|
specs "github.com/opencontainers/runtime-spec/specs-go"
|
||||||
"github.com/urfave/cli"
|
"github.com/urfave/cli"
|
||||||
"google.golang.org/grpc"
|
"google.golang.org/grpc"
|
||||||
)
|
)
|
||||||
@ -152,3 +154,38 @@ func stopCatch(sigc chan os.Signal) {
|
|||||||
signal.Stop(sigc)
|
signal.Stop(sigc)
|
||||||
close(sigc)
|
close(sigc)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// parseMountFlag parses a mount string in the form "type=foo,source=/path,destination=/target,options=rbind:rw"
|
||||||
|
func parseMountFlag(m string) (specs.Mount, error) {
|
||||||
|
mount := specs.Mount{}
|
||||||
|
r := csv.NewReader(strings.NewReader(m))
|
||||||
|
|
||||||
|
fields, err := r.Read()
|
||||||
|
if err != nil {
|
||||||
|
return mount, err
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, field := range fields {
|
||||||
|
v := strings.Split(field, "=")
|
||||||
|
if len(v) != 2 {
|
||||||
|
return mount, fmt.Errorf("invalid mount specification: expected key=val")
|
||||||
|
}
|
||||||
|
|
||||||
|
key := v[0]
|
||||||
|
val := v[1]
|
||||||
|
switch key {
|
||||||
|
case "type":
|
||||||
|
mount.Type = val
|
||||||
|
case "source", "src":
|
||||||
|
mount.Source = val
|
||||||
|
case "destination", "dst":
|
||||||
|
mount.Destination = val
|
||||||
|
case "options":
|
||||||
|
mount.Options = strings.Split(val, ":")
|
||||||
|
default:
|
||||||
|
return mount, fmt.Errorf("mount option %q not supported", key)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return mount, nil
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user