Remove duplicate code between create.go and run.go

Create two new createInit for checking if the cotnainer is initialized
correctly.
createContainer which creates the actual container and containerConfig

Also added libpodruntime.GetContainerRuntime to put common runtime code
into separate function.

Signed-off-by: Daniel J Walsh <dwalsh@redhat.com>
This commit is contained in:
Daniel J Walsh
2018-09-13 12:16:14 -04:00
parent 61eda671ec
commit ecec1a5430
3 changed files with 57 additions and 146 deletions

View File

@ -57,6 +57,26 @@ var createCommand = cli.Command{
}
func createCmd(c *cli.Context) error {
if err := createInit(c); err != nil {
return err
}
runtime, err := libpodruntime.GetContainerRuntime(c)
if err != nil {
return errors.Wrapf(err, "error creating libpod runtime")
}
defer runtime.Shutdown(false)
ctr, _, err := createContainer(c, runtime)
if err != nil {
return err
}
fmt.Printf("%s\n", ctr.ID())
return nil
}
func createInit(c *cli.Context) error {
// TODO should allow user to create based off a directory on the host not just image
// Need CLI support for this
@ -83,63 +103,46 @@ func createCmd(c *cli.Context) error {
return errors.Errorf("image name or ID is required")
}
return nil
}
func createContainer(c *cli.Context, runtime *libpod.Runtime) (*libpod.Container, *cc.CreateConfig, error) {
rtc := runtime.GetConfig()
ctx := getContext()
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
}
storageOpts, err := libpodruntime.GetDefaultStoreOptions()
if err != nil {
return err
}
storageOpts.UIDMap = mappings.UIDMap
storageOpts.GIDMap = mappings.GIDMap
if os.Geteuid() != 0 {
rootless.SetSkipStorageSetup(true)
}
runtime, err := libpodruntime.GetRuntimeWithStorageOpts(c, &storageOpts)
if err != nil {
return errors.Wrapf(err, "error creating libpod runtime")
}
defer runtime.Shutdown(false)
rtc := runtime.GetConfig()
ctx := getContext()
imageName := ""
var data *inspect.ImageData = nil
if rootfs == "" && !rootless.SkipStorageSetup() {
newImage, err := runtime.ImageRuntime().New(ctx, c.Args()[0], rtc.SignaturePolicyPath, "", os.Stderr, nil, image.SigningOptions{}, false, false)
if err != nil {
return err
return nil, nil, err
}
data, err = newImage.Inspect(ctx)
imageName = newImage.Names()[0]
}
createConfig, err := parseCreateOpts(ctx, c, runtime, imageName, data)
if err != nil {
return err
return nil, nil, err
}
runtimeSpec, err := cc.CreateConfigToOCISpec(createConfig)
if err != nil {
return err
return nil, nil, err
}
options, err := createConfig.GetContainerCreateOptions(runtime)
if err != nil {
return err
return nil, nil, err
}
became, ret, err := joinOrCreateRootlessUserNamespace(createConfig, runtime)
if err != nil {
return err
return nil, nil, err
}
if became {
os.Exit(ret)
@ -147,27 +150,25 @@ func createCmd(c *cli.Context) error {
ctr, err := runtime.NewContainer(ctx, runtimeSpec, options...)
if err != nil {
return err
return nil, nil, err
}
createConfigJSON, err := json.Marshal(createConfig)
if err != nil {
return err
return nil, nil, err
}
if err := ctr.AddArtifact("create-config", createConfigJSON); err != nil {
return err
return nil, nil, err
}
logrus.Debug("new container created ", ctr.ID())
if c.String("cidfile") != "" {
err := libpod.WriteFile(ctr.ID(), c.String("cidfile"))
if err != nil {
logrus.Error(err)
}
}
fmt.Printf("%s\n", ctr.ID())
return nil
logrus.Debugf("New container created %q", ctr.ID())
return ctr, createConfig, nil
}
// Checks if a user-specified AppArmor profile is loaded, or loads the default profile if

View File

@ -7,6 +7,7 @@ import (
"github.com/containers/libpod/libpod"
"github.com/containers/libpod/pkg/rootless"
"github.com/containers/libpod/pkg/util"
"github.com/containers/storage"
"github.com/pkg/errors"
"github.com/urfave/cli"
@ -21,6 +22,21 @@ func GetRuntime(c *cli.Context) (*libpod.Runtime, error) {
return GetRuntimeWithStorageOpts(c, &storageOpts)
}
// GetContainerRuntime generates a new libpod runtime configured by command line options for containers
func GetContainerRuntime(c *cli.Context) (*libpod.Runtime, error) {
mappings, err := util.ParseIDMapping(c.StringSlice("uidmap"), c.StringSlice("gidmap"), c.String("subuidmap"), c.String("subgidmap"))
if err != nil {
return nil, err
}
storageOpts, err := GetDefaultStoreOptions()
if err != nil {
return nil, err
}
storageOpts.UIDMap = mappings.UIDMap
storageOpts.GIDMap = mappings.GIDMap
return GetRuntimeWithStorageOpts(c, &storageOpts)
}
func GetRootlessStorageOpts() (storage.StoreOptions, error) {
var opts storage.StoreOptions

View File

@ -1,7 +1,6 @@
package main
import (
"encoding/json"
"fmt"
"io/ioutil"
"os"
@ -11,11 +10,6 @@ import (
"github.com/containers/libpod/cmd/podman/libpodruntime"
"github.com/containers/libpod/libpod"
"github.com/containers/libpod/libpod/image"
"github.com/containers/libpod/pkg/inspect"
"github.com/containers/libpod/pkg/rootless"
cc "github.com/containers/libpod/pkg/spec"
"github.com/containers/libpod/pkg/util"
"github.com/pkg/errors"
"github.com/sirupsen/logrus"
"github.com/urfave/cli"
@ -42,107 +36,20 @@ var runCommand = cli.Command{
}
func runCmd(c *cli.Context) error {
var imageName string
// Docker-compatibility: the "-h" flag for run/create is reserved for
// the hostname (see https://github.com/containers/libpod/issues/1367).
if c.Bool("help") {
cli.ShowCommandHelpAndExit(c, "run", 0)
}
if err := validateFlags(c, createFlags); err != nil {
if err := createInit(c); err != nil {
return err
}
if c.String("cidfile") != "" {
if _, err := os.Stat(c.String("cidfile")); err == nil {
return errors.Errorf("container id file exists. ensure another container is not using it or delete %s", c.String("cidfile"))
}
if err := libpod.WriteFile("", c.String("cidfile")); err != nil {
return errors.Wrapf(err, "unable to write cidfile %s", c.String("cidfile"))
}
}
storageOpts, err := libpodruntime.GetDefaultStoreOptions()
if err != nil {
return err
}
mappings, err := util.ParseIDMapping(c.StringSlice("uidmap"), c.StringSlice("gidmap"), c.String("subuidmap"), c.String("subgidmap"))
if err != nil {
return err
}
storageOpts.UIDMap = mappings.UIDMap
storageOpts.GIDMap = mappings.GIDMap
if os.Geteuid() != 0 {
rootless.SetSkipStorageSetup(true)
}
runtime, err := libpodruntime.GetRuntimeWithStorageOpts(c, &storageOpts)
runtime, err := libpodruntime.GetContainerRuntime(c)
if err != nil {
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()
var newImage *image.Image = nil
var data *inspect.ImageData = nil
if rootfs == "" && !rootless.SkipStorageSetup() {
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)
ctr, createConfig, err := createContainer(c, runtime)
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 {
return err
}
runtimeSpec, err := cc.CreateConfigToOCISpec(createConfig)
if err != nil {
return err
}
options, err := createConfig.GetContainerCreateOptions(runtime)
if err != nil {
return err
}
became, ret, err := joinOrCreateRootlessUserNamespace(createConfig, runtime)
if err != nil {
return err
}
if became {
os.Exit(ret)
}
ctr, err := runtime.NewContainer(ctx, runtimeSpec, options...)
if err != nil {
return err
}
logrus.Debugf("New container created %q", ctr.ID())
if logrus.GetLevel() == logrus.DebugLevel {
cgroupPath, err := ctr.CGroupPath()
@ -151,20 +58,7 @@ func runCmd(c *cli.Context) error {
}
}
createConfigJSON, err := json.Marshal(createConfig)
if err != nil {
return err
}
if err := ctr.AddArtifact("create-config", createConfigJSON); err != nil {
return err
}
if c.String("cidfile") != "" {
if err := libpod.WriteFile(ctr.ID(), c.String("cidfile")); err != nil {
logrus.Error(err)
}
}
ctx := getContext()
// Handle detached start
if createConfig.Detach {
if err := ctr.Start(ctx); err != nil {