summaryrefslogtreecommitdiff
path: root/cmd
diff options
context:
space:
mode:
authorGiuseppe Scrivano <gscrivan@redhat.com>2018-04-26 17:21:48 +0200
committerAtomic Bot <atomic-devel@projectatomic.io>2018-06-15 14:53:18 +0000
commit7bdfb4f9b361aca4f4f3337907feb3ca414d36e4 (patch)
treeaff63093af49df79820e72a5a68f07e6fe70b863 /cmd
parent4b4de5dc21f034f5f678114dbf6d51f047c96a59 (diff)
downloadpodman-7bdfb4f9b361aca4f4f3337907feb3ca414d36e4.tar.gz
podman-7bdfb4f9b361aca4f4f3337907feb3ca414d36e4.tar.bz2
podman-7bdfb4f9b361aca4f4f3337907feb3ca414d36e4.zip
podman: accept option --rootfs to use exploded images
Signed-off-by: Giuseppe Scrivano <gscrivan@redhat.com> Closes: #871 Approved by: mheon
Diffstat (limited to 'cmd')
-rw-r--r--cmd/podman/common.go4
-rw-r--r--cmd/podman/create.go97
-rw-r--r--cmd/podman/run.go39
3 files changed, 99 insertions, 41 deletions
diff --git a/cmd/podman/common.go b/cmd/podman/common.go
index f38348a65..f647f9c4d 100644
--- a/cmd/podman/common.go
+++ b/cmd/podman/common.go
@@ -322,6 +322,10 @@ var createFlags = []cli.Flag{
Name: "rm",
Usage: "Remove container (and pod if created) after exit",
},
+ cli.BoolFlag{
+ Name: "rootfs",
+ Usage: "The first argument is not an image but the rootfs to the exploded container",
+ },
cli.StringSliceFlag{
Name: "security-opt",
Usage: "Security Options (default [])",
diff --git a/cmd/podman/create.go b/cmd/podman/create.go
index 8d66beab0..a0c1ec3f0 100644
--- a/cmd/podman/create.go
+++ b/cmd/podman/create.go
@@ -72,6 +72,11 @@ func createCmd(c *cli.Context) error {
return errors.Errorf("image name or ID is required")
}
+ rootfs := ""
+ if c.Bool("rootfs") {
+ rootfs = c.Args()[0]
+ }
+
mappings, err := util.ParseIDMapping(c.StringSlice("uidmap"), c.StringSlice("gidmap"), c.String("subuidmap"), c.String("subgidmap"))
if err != nil {
return err
@@ -89,12 +94,17 @@ func createCmd(c *cli.Context) error {
rtc := runtime.GetConfig()
ctx := getContext()
- newImage, err := runtime.ImageRuntime().New(ctx, c.Args()[0], rtc.SignaturePolicyPath, "", os.Stderr, nil, image.SigningOptions{}, false, false)
- if err != nil {
- return err
+ imageName := ""
+ var data *inspect.ImageData = nil
+ if rootfs == "" {
+ newImage, err := runtime.ImageRuntime().New(ctx, c.Args()[0], rtc.SignaturePolicyPath, "", os.Stderr, nil, image.SigningOptions{}, false, false)
+ if err != nil {
+ return err
+ }
+ data, err = newImage.Inspect(ctx)
+ imageName = newImage.Names()[0]
}
- data, err := newImage.Inspect(ctx)
- createConfig, err := parseCreateOpts(ctx, c, runtime, newImage.Names()[0], data)
+ createConfig, err := parseCreateOpts(ctx, c, runtime, imageName, data)
if err != nil {
return err
}
@@ -118,6 +128,9 @@ func createCmd(c *cli.Context) error {
options = append(options, libpod.WithShmSize(createConfig.Resources.ShmSize))
options = append(options, libpod.WithGroups(createConfig.GroupAdd))
options = append(options, libpod.WithIDMappings(*createConfig.IDMappings))
+ if createConfig.Rootfs != "" {
+ options = append(options, libpod.WithRootFS(createConfig.Rootfs))
+ }
ctr, err := runtime.NewContainer(ctx, runtimeSpec, options...)
if err != nil {
return err
@@ -246,10 +259,16 @@ func parseCreateOpts(ctx context.Context, c *cli.Context, runtime *libpod.Runtim
return nil, err
}
- imageID := data.ID
+ imageID := ""
+
+ inputCommand = c.Args()[1:]
+ if data != nil {
+ imageID = data.ID
+ }
- if len(c.Args()) > 1 {
- inputCommand = c.Args()[1:]
+ rootfs := ""
+ if c.Bool("rootfs") {
+ rootfs = c.Args()[0]
}
sysctl, err := validateSysctl(c.StringSlice("sysctl"))
@@ -337,12 +356,19 @@ func parseCreateOpts(ctx context.Context, c *cli.Context, runtime *libpod.Runtim
// USER
user := c.String("user")
if user == "" {
- user = data.ContainerConfig.User
+ if data == nil {
+ user = "0"
+ } else {
+ user = data.ContainerConfig.User
+ }
}
// STOP SIGNAL
stopSignal := syscall.SIGTERM
- signalString := data.ContainerConfig.StopSignal
+ signalString := "SIGTERM"
+ if data != nil {
+ signalString = data.ContainerConfig.StopSignal
+ }
if c.IsSet("stop-signal") {
signalString = c.String("stop-signal")
}
@@ -355,12 +381,14 @@ func parseCreateOpts(ctx context.Context, c *cli.Context, runtime *libpod.Runtim
// ENVIRONMENT VARIABLES
env := defaultEnvVariables
- for _, e := range data.ContainerConfig.Env {
- split := strings.SplitN(e, "=", 2)
- if len(split) > 1 {
- env[split[0]] = split[1]
- } else {
- env[split[0]] = ""
+ if data != nil {
+ for _, e := range data.ContainerConfig.Env {
+ split := strings.SplitN(e, "=", 2)
+ if len(split) > 1 {
+ env[split[0]] = split[1]
+ } else {
+ env[split[0]] = ""
+ }
}
}
if err := readKVStrings(env, c.StringSlice("env-file"), c.StringSlice("env")); err != nil {
@@ -372,9 +400,11 @@ func parseCreateOpts(ctx context.Context, c *cli.Context, runtime *libpod.Runtim
if err != nil {
return nil, errors.Wrapf(err, "unable to process labels")
}
- for key, val := range data.ContainerConfig.Labels {
- if _, ok := labels[key]; !ok {
- labels[key] = val
+ if data != nil {
+ for key, val := range data.ContainerConfig.Labels {
+ if _, ok := labels[key]; !ok {
+ labels[key] = val
+ }
}
}
@@ -386,9 +416,11 @@ func parseCreateOpts(ctx context.Context, c *cli.Context, runtime *libpod.Runtim
if tty {
annotations[ann.TTY] = "true"
}
- // Next, add annotations from the image
- for key, value := range data.Annotations {
- annotations[key] = value
+ if data != nil {
+ // Next, add annotations from the image
+ for key, value := range data.Annotations {
+ annotations[key] = value
+ }
}
// Last, add user annotations
for _, annotation := range c.StringSlice("annotation") {
@@ -403,14 +435,14 @@ func parseCreateOpts(ctx context.Context, c *cli.Context, runtime *libpod.Runtim
workDir := "/"
if c.IsSet("workdir") || c.IsSet("w") {
workDir = c.String("workdir")
- } else if data.ContainerConfig.WorkingDir != "" {
+ } else if data != nil && data.ContainerConfig.WorkingDir != "" {
workDir = data.ContainerConfig.WorkingDir
}
// ENTRYPOINT
// User input entrypoint takes priority over image entrypoint
entrypoint := c.StringSlice("entrypoint")
- if len(entrypoint) == 0 {
+ if len(entrypoint) == 0 && data != nil {
entrypoint = data.ContainerConfig.Entrypoint
}
// if entrypoint=, we need to clear the entrypoint
@@ -425,7 +457,7 @@ func parseCreateOpts(ctx context.Context, c *cli.Context, runtime *libpod.Runtim
if len(inputCommand) > 0 {
// User command overrides data CMD
command = append(command, inputCommand...)
- } else if len(data.ContainerConfig.Cmd) > 0 && !c.IsSet("entrypoint") {
+ } else if data != nil && len(data.ContainerConfig.Cmd) > 0 && !c.IsSet("entrypoint") {
// If not user command, add CMD
command = append(command, data.ContainerConfig.Cmd...)
}
@@ -435,9 +467,12 @@ func parseCreateOpts(ctx context.Context, c *cli.Context, runtime *libpod.Runtim
}
// EXPOSED PORTS
- portBindings, err := cc.ExposedPorts(c.StringSlice("expose"), c.StringSlice("publish"), c.Bool("publish-all"), data.ContainerConfig.ExposedPorts)
- if err != nil {
- return nil, err
+ var portBindings map[nat.Port][]nat.PortBinding
+ if data != nil {
+ portBindings, err = cc.ExposedPorts(c.StringSlice("expose"), c.StringSlice("publish"), c.Bool("publish-all"), data.ContainerConfig.ExposedPorts)
+ if err != nil {
+ return nil, err
+ }
}
// SHM Size
@@ -472,8 +507,11 @@ func parseCreateOpts(ctx context.Context, c *cli.Context, runtime *libpod.Runtim
return nil, err
}
}
- ImageVolumes := data.ContainerConfig.Volumes
+ var ImageVolumes map[string]struct{}
+ if data != nil {
+ ImageVolumes = data.ContainerConfig.Volumes
+ }
var imageVolType = map[string]string{
"bind": "",
"tmpfs": "",
@@ -567,6 +605,7 @@ func parseCreateOpts(ctx context.Context, c *cli.Context, runtime *libpod.Runtim
UsernsMode: usernsMode,
Volumes: c.StringSlice("volume"),
WorkDir: workDir,
+ Rootfs: rootfs,
}
if !config.Privileged {
diff --git a/cmd/podman/run.go b/cmd/podman/run.go
index 3e7dc2303..2131df7ab 100644
--- a/cmd/podman/run.go
+++ b/cmd/podman/run.go
@@ -14,6 +14,7 @@ import (
"github.com/projectatomic/libpod/cmd/podman/libpodruntime"
"github.com/projectatomic/libpod/libpod"
"github.com/projectatomic/libpod/libpod/image"
+ "github.com/projectatomic/libpod/pkg/inspect"
cc "github.com/projectatomic/libpod/pkg/spec"
"github.com/projectatomic/libpod/pkg/util"
"github.com/sirupsen/logrus"
@@ -66,25 +67,36 @@ func runCmd(c *cli.Context) error {
return errors.Wrapf(err, "error creating libpod runtime")
}
defer runtime.Shutdown(false)
+
if len(c.Args()) < 1 {
return errors.Errorf("image name or ID is required")
}
+ rootfs := ""
+ if c.Bool("rootfs") {
+ rootfs = c.Args()[0]
+ }
+
ctx := getContext()
rtc := runtime.GetConfig()
- newImage, err := runtime.ImageRuntime().New(ctx, c.Args()[0], rtc.SignaturePolicyPath, "", os.Stderr, nil, image.SigningOptions{}, false, false)
- if err != nil {
- return errors.Wrapf(err, "unable to find image")
- }
- data, err := newImage.Inspect(ctx)
- if err != nil {
- return err
- }
- if len(newImage.Names()) < 1 {
- imageName = newImage.ID()
- } else {
- imageName = newImage.Names()[0]
+ var newImage *image.Image = nil
+ var data *inspect.ImageData = nil
+ if rootfs == "" {
+ newImage, err = runtime.ImageRuntime().New(ctx, c.Args()[0], rtc.SignaturePolicyPath, "", os.Stderr, nil, image.SigningOptions{}, false, false)
+ if err != nil {
+ return errors.Wrapf(err, "unable to find image")
+ }
+
+ data, err = newImage.Inspect(ctx)
+ if err != nil {
+ return err
+ }
+ if len(newImage.Names()) < 1 {
+ imageName = newImage.ID()
+ } else {
+ imageName = newImage.Names()[0]
+ }
}
createConfig, err := parseCreateOpts(ctx, c, runtime, imageName, data)
if err != nil {
@@ -112,6 +124,9 @@ func runCmd(c *cli.Context) error {
options = append(options, libpod.WithShmSize(createConfig.Resources.ShmSize))
options = append(options, libpod.WithGroups(createConfig.GroupAdd))
options = append(options, libpod.WithIDMappings(*createConfig.IDMappings))
+ if createConfig.Rootfs != "" {
+ options = append(options, libpod.WithRootFS(createConfig.Rootfs))
+ }
// Default used if not overridden on command line