Merge pull request #1461 from rhatdan/run
Remove duplicate code between create.go and run.go
This commit is contained in:
commit
8b21e2ecf5
|
|
@ -57,6 +57,26 @@ var createCommand = cli.Command{
|
||||||
}
|
}
|
||||||
|
|
||||||
func createCmd(c *cli.Context) error {
|
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
|
// TODO should allow user to create based off a directory on the host not just image
|
||||||
// Need CLI support for this
|
// 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 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 := ""
|
rootfs := ""
|
||||||
if c.Bool("rootfs") {
|
if c.Bool("rootfs") {
|
||||||
rootfs = c.Args()[0]
|
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 := ""
|
imageName := ""
|
||||||
var data *inspect.ImageData = nil
|
var data *inspect.ImageData = nil
|
||||||
|
|
||||||
if rootfs == "" && !rootless.SkipStorageSetup() {
|
if rootfs == "" && !rootless.SkipStorageSetup() {
|
||||||
newImage, err := runtime.ImageRuntime().New(ctx, c.Args()[0], rtc.SignaturePolicyPath, "", os.Stderr, nil, image.SigningOptions{}, false, false)
|
newImage, err := runtime.ImageRuntime().New(ctx, c.Args()[0], rtc.SignaturePolicyPath, "", os.Stderr, nil, image.SigningOptions{}, false, false)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return nil, nil, err
|
||||||
}
|
}
|
||||||
data, err = newImage.Inspect(ctx)
|
data, err = newImage.Inspect(ctx)
|
||||||
imageName = newImage.Names()[0]
|
imageName = newImage.Names()[0]
|
||||||
}
|
}
|
||||||
createConfig, err := parseCreateOpts(ctx, c, runtime, imageName, data)
|
createConfig, err := parseCreateOpts(ctx, c, runtime, imageName, data)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return nil, nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
runtimeSpec, err := cc.CreateConfigToOCISpec(createConfig)
|
runtimeSpec, err := cc.CreateConfigToOCISpec(createConfig)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return nil, nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
options, err := createConfig.GetContainerCreateOptions(runtime)
|
options, err := createConfig.GetContainerCreateOptions(runtime)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return nil, nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
became, ret, err := joinOrCreateRootlessUserNamespace(createConfig, runtime)
|
became, ret, err := joinOrCreateRootlessUserNamespace(createConfig, runtime)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return nil, nil, err
|
||||||
}
|
}
|
||||||
if became {
|
if became {
|
||||||
os.Exit(ret)
|
os.Exit(ret)
|
||||||
|
|
@ -147,27 +150,25 @@ func createCmd(c *cli.Context) error {
|
||||||
|
|
||||||
ctr, err := runtime.NewContainer(ctx, runtimeSpec, options...)
|
ctr, err := runtime.NewContainer(ctx, runtimeSpec, options...)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return nil, nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
createConfigJSON, err := json.Marshal(createConfig)
|
createConfigJSON, err := json.Marshal(createConfig)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return nil, nil, err
|
||||||
}
|
}
|
||||||
if err := ctr.AddArtifact("create-config", createConfigJSON); err != nil {
|
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") != "" {
|
if c.String("cidfile") != "" {
|
||||||
err := libpod.WriteFile(ctr.ID(), c.String("cidfile"))
|
err := libpod.WriteFile(ctr.ID(), c.String("cidfile"))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logrus.Error(err)
|
logrus.Error(err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
fmt.Printf("%s\n", ctr.ID())
|
logrus.Debugf("New container created %q", ctr.ID())
|
||||||
return nil
|
return ctr, createConfig, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// Checks if a user-specified AppArmor profile is loaded, or loads the default profile if
|
// Checks if a user-specified AppArmor profile is loaded, or loads the default profile if
|
||||||
|
|
|
||||||
|
|
@ -7,6 +7,7 @@ import (
|
||||||
|
|
||||||
"github.com/containers/libpod/libpod"
|
"github.com/containers/libpod/libpod"
|
||||||
"github.com/containers/libpod/pkg/rootless"
|
"github.com/containers/libpod/pkg/rootless"
|
||||||
|
"github.com/containers/libpod/pkg/util"
|
||||||
"github.com/containers/storage"
|
"github.com/containers/storage"
|
||||||
"github.com/pkg/errors"
|
"github.com/pkg/errors"
|
||||||
"github.com/urfave/cli"
|
"github.com/urfave/cli"
|
||||||
|
|
@ -21,6 +22,21 @@ func GetRuntime(c *cli.Context) (*libpod.Runtime, error) {
|
||||||
return GetRuntimeWithStorageOpts(c, &storageOpts)
|
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) {
|
func GetRootlessStorageOpts() (storage.StoreOptions, error) {
|
||||||
var opts storage.StoreOptions
|
var opts storage.StoreOptions
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,6 @@
|
||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/json"
|
|
||||||
"fmt"
|
"fmt"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"os"
|
"os"
|
||||||
|
|
@ -11,11 +10,6 @@ import (
|
||||||
|
|
||||||
"github.com/containers/libpod/cmd/podman/libpodruntime"
|
"github.com/containers/libpod/cmd/podman/libpodruntime"
|
||||||
"github.com/containers/libpod/libpod"
|
"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/pkg/errors"
|
||||||
"github.com/sirupsen/logrus"
|
"github.com/sirupsen/logrus"
|
||||||
"github.com/urfave/cli"
|
"github.com/urfave/cli"
|
||||||
|
|
@ -42,107 +36,20 @@ var runCommand = cli.Command{
|
||||||
}
|
}
|
||||||
|
|
||||||
func runCmd(c *cli.Context) error {
|
func runCmd(c *cli.Context) error {
|
||||||
var imageName string
|
if err := createInit(c); err != nil {
|
||||||
|
|
||||||
// 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 {
|
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
if c.String("cidfile") != "" {
|
runtime, err := libpodruntime.GetContainerRuntime(c)
|
||||||
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)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return errors.Wrapf(err, "error creating libpod runtime")
|
return errors.Wrapf(err, "error creating libpod runtime")
|
||||||
}
|
}
|
||||||
defer runtime.Shutdown(false)
|
defer runtime.Shutdown(false)
|
||||||
|
|
||||||
if len(c.Args()) < 1 {
|
ctr, createConfig, err := createContainer(c, runtime)
|
||||||
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)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
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 {
|
if logrus.GetLevel() == logrus.DebugLevel {
|
||||||
cgroupPath, err := ctr.CGroupPath()
|
cgroupPath, err := ctr.CGroupPath()
|
||||||
|
|
@ -151,20 +58,7 @@ func runCmd(c *cli.Context) error {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
createConfigJSON, err := json.Marshal(createConfig)
|
ctx := getContext()
|
||||||
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)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Handle detached start
|
// Handle detached start
|
||||||
if createConfig.Detach {
|
if createConfig.Detach {
|
||||||
if err := ctr.Start(ctx); err != nil {
|
if err := ctr.Start(ctx); err != nil {
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue