summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOpenShift Merge Robot <openshift-merge-robot@users.noreply.github.com>2019-04-26 15:28:15 -0700
committerGitHub <noreply@github.com>2019-04-26 15:28:15 -0700
commitfe3acddcbe02cfa258170707791bd096dc909022 (patch)
tree9a68b96d5f85adcc67189e97e1c788786c20b32c
parentb6e2cbad0a4581a8fe4954ff4a9202461a526781 (diff)
parentf49e0c19ede56b1cc6b1d44ea9ba8b336cd22658 (diff)
downloadpodman-fe3acddcbe02cfa258170707791bd096dc909022.tar.gz
podman-fe3acddcbe02cfa258170707791bd096dc909022.tar.bz2
podman-fe3acddcbe02cfa258170707791bd096dc909022.zip
Merge pull request #2950 from giuseppe/podman-system-migrate
system: add new subcommand "migrate"
-rw-r--r--cmd/podman/attach.go2
-rw-r--r--cmd/podman/build.go2
-rw-r--r--cmd/podman/checkpoint.go2
-rw-r--r--cmd/podman/cleanup.go2
-rw-r--r--cmd/podman/cliconfig/config.go4
-rw-r--r--cmd/podman/commands.go1
-rw-r--r--cmd/podman/commit.go2
-rw-r--r--cmd/podman/containers_prune.go2
-rw-r--r--cmd/podman/cp.go2
-rw-r--r--cmd/podman/create.go2
-rw-r--r--cmd/podman/diff.go2
-rw-r--r--cmd/podman/events.go2
-rw-r--r--cmd/podman/exec.go2
-rw-r--r--cmd/podman/exists.go6
-rw-r--r--cmd/podman/export.go2
-rw-r--r--cmd/podman/generate_kube.go2
-rw-r--r--cmd/podman/healthcheck_run.go2
-rw-r--r--cmd/podman/history.go2
-rw-r--r--cmd/podman/images.go2
-rw-r--r--cmd/podman/images_prune.go2
-rw-r--r--cmd/podman/import.go2
-rw-r--r--cmd/podman/info.go2
-rw-r--r--cmd/podman/inspect.go2
-rw-r--r--cmd/podman/kill.go2
-rw-r--r--cmd/podman/libpodruntime/runtime.go22
-rw-r--r--cmd/podman/load.go2
-rw-r--r--cmd/podman/logs.go2
-rw-r--r--cmd/podman/main_local.go4
-rw-r--r--cmd/podman/mount.go2
-rw-r--r--cmd/podman/pause.go2
-rw-r--r--cmd/podman/play_kube.go2
-rw-r--r--cmd/podman/pod_create.go2
-rw-r--r--cmd/podman/pod_inspect.go2
-rw-r--r--cmd/podman/pod_kill.go2
-rw-r--r--cmd/podman/pod_pause.go2
-rw-r--r--cmd/podman/pod_ps.go2
-rw-r--r--cmd/podman/pod_restart.go2
-rw-r--r--cmd/podman/pod_rm.go2
-rw-r--r--cmd/podman/pod_start.go2
-rw-r--r--cmd/podman/pod_stats.go2
-rw-r--r--cmd/podman/pod_stop.go2
-rw-r--r--cmd/podman/pod_top.go2
-rw-r--r--cmd/podman/pod_unpause.go2
-rw-r--r--cmd/podman/pods_prune.go2
-rw-r--r--cmd/podman/port.go2
-rw-r--r--cmd/podman/ps.go2
-rw-r--r--cmd/podman/pull.go2
-rw-r--r--cmd/podman/push.go2
-rw-r--r--cmd/podman/refresh.go2
-rw-r--r--cmd/podman/restart.go2
-rw-r--r--cmd/podman/restore.go2
-rw-r--r--cmd/podman/rm.go2
-rw-r--r--cmd/podman/rmi.go2
-rw-r--r--cmd/podman/run.go2
-rw-r--r--cmd/podman/runlabel.go2
-rw-r--r--cmd/podman/save.go2
-rw-r--r--cmd/podman/sign.go2
-rw-r--r--cmd/podman/start.go2
-rw-r--r--cmd/podman/stats.go2
-rw-r--r--cmd/podman/stop.go2
-rw-r--r--cmd/podman/system_df.go2
-rw-r--r--cmd/podman/system_migrate.go50
-rw-r--r--cmd/podman/system_prune.go2
-rw-r--r--cmd/podman/system_renumber.go2
-rw-r--r--cmd/podman/tag.go2
-rw-r--r--cmd/podman/top.go2
-rw-r--r--cmd/podman/tree.go2
-rw-r--r--cmd/podman/trust_set_show.go4
-rw-r--r--cmd/podman/umount.go2
-rw-r--r--cmd/podman/unpause.go2
-rw-r--r--cmd/podman/varlink.go2
-rw-r--r--cmd/podman/volume_create.go2
-rw-r--r--cmd/podman/volume_inspect.go2
-rw-r--r--cmd/podman/volume_ls.go2
-rw-r--r--cmd/podman/volume_prune.go2
-rw-r--r--cmd/podman/volume_rm.go2
-rw-r--r--cmd/podman/wait.go2
-rw-r--r--docs/podman-system-migrate.1.md21
-rw-r--r--docs/podman-system.1.md1
-rw-r--r--libpod/options.go30
-rw-r--r--libpod/runtime.go23
-rw-r--r--libpod/runtime_migrate.go47
-rw-r--r--pkg/adapter/runtime.go4
-rw-r--r--pkg/adapter/runtime_remote.go2
84 files changed, 274 insertions, 85 deletions
diff --git a/cmd/podman/attach.go b/cmd/podman/attach.go
index c07c0f1cf..37f8afbad 100644
--- a/cmd/podman/attach.go
+++ b/cmd/podman/attach.go
@@ -47,7 +47,7 @@ func attachCmd(c *cliconfig.AttachValues) error {
if remoteclient && len(c.InputArgs) != 1 {
return errors.Errorf("attach requires the name or id of one running container")
}
- runtime, err := adapter.GetRuntime(&c.PodmanCommand)
+ runtime, err := adapter.GetRuntime(getContext(), &c.PodmanCommand)
if err != nil {
return errors.Wrapf(err, "error creating runtime")
}
diff --git a/cmd/podman/build.go b/cmd/podman/build.go
index b69ac6e84..647ff1e86 100644
--- a/cmd/podman/build.go
+++ b/cmd/podman/build.go
@@ -206,7 +206,7 @@ func buildCmd(c *cliconfig.BuildValues) error {
dockerfiles = append(dockerfiles, filepath.Join(contextDir, "Dockerfile"))
}
- runtime, err := adapter.GetRuntime(&c.PodmanCommand)
+ runtime, err := adapter.GetRuntime(getContext(), &c.PodmanCommand)
if err != nil {
return errors.Wrapf(err, "could not get runtime")
}
diff --git a/cmd/podman/checkpoint.go b/cmd/podman/checkpoint.go
index f2f5d37da..234d683bb 100644
--- a/cmd/podman/checkpoint.go
+++ b/cmd/podman/checkpoint.go
@@ -54,7 +54,7 @@ func checkpointCmd(c *cliconfig.CheckpointValues) error {
return errors.New("checkpointing a container requires root")
}
- runtime, err := adapter.GetRuntime(&c.PodmanCommand)
+ runtime, err := adapter.GetRuntime(getContext(), &c.PodmanCommand)
if err != nil {
return errors.Wrapf(err, "could not get runtime")
}
diff --git a/cmd/podman/cleanup.go b/cmd/podman/cleanup.go
index f5b3cf55b..9434c68ba 100644
--- a/cmd/podman/cleanup.go
+++ b/cmd/podman/cleanup.go
@@ -49,7 +49,7 @@ func init() {
}
func cleanupCmd(c *cliconfig.CleanupValues) error {
- runtime, err := libpodruntime.GetRuntime(&c.PodmanCommand)
+ runtime, err := libpodruntime.GetRuntime(getContext(), &c.PodmanCommand)
if err != nil {
return errors.Wrapf(err, "could not get runtime")
}
diff --git a/cmd/podman/cliconfig/config.go b/cmd/podman/cliconfig/config.go
index 640a4bff4..77156f47a 100644
--- a/cmd/podman/cliconfig/config.go
+++ b/cmd/podman/cliconfig/config.go
@@ -581,6 +581,10 @@ type SystemRenumberValues struct {
PodmanCommand
}
+type SystemMigrateValues struct {
+ PodmanCommand
+}
+
type SystemDfValues struct {
PodmanCommand
Verbose bool
diff --git a/cmd/podman/commands.go b/cmd/podman/commands.go
index c43ecec5c..36c28696f 100644
--- a/cmd/podman/commands.go
+++ b/cmd/podman/commands.go
@@ -77,6 +77,7 @@ func getSystemSubCommands() []*cobra.Command {
_pruneSystemCommand,
_renumberCommand,
_dfSystemCommand,
+ _migrateCommand,
}
}
diff --git a/cmd/podman/commit.go b/cmd/podman/commit.go
index 8d79c1e28..2b38bab35 100644
--- a/cmd/podman/commit.go
+++ b/cmd/podman/commit.go
@@ -52,7 +52,7 @@ func init() {
}
func commitCmd(c *cliconfig.CommitValues) error {
- runtime, err := libpodruntime.GetRuntime(&c.PodmanCommand)
+ runtime, err := libpodruntime.GetRuntime(getContext(), &c.PodmanCommand)
if err != nil {
return errors.Wrapf(err, "could not get runtime")
}
diff --git a/cmd/podman/containers_prune.go b/cmd/podman/containers_prune.go
index abc56cee1..8270669c9 100644
--- a/cmd/podman/containers_prune.go
+++ b/cmd/podman/containers_prune.go
@@ -75,7 +75,7 @@ func pruneContainers(runtime *adapter.LocalRuntime, ctx context.Context, maxWork
}
func pruneContainersCmd(c *cliconfig.PruneContainersValues) error {
- runtime, err := adapter.GetRuntime(&c.PodmanCommand)
+ runtime, err := adapter.GetRuntime(getContext(), &c.PodmanCommand)
if err != nil {
return errors.Wrapf(err, "could not get runtime")
}
diff --git a/cmd/podman/cp.go b/cmd/podman/cp.go
index 6e48b9f3b..82f2d3f20 100644
--- a/cmd/podman/cp.go
+++ b/cmd/podman/cp.go
@@ -58,7 +58,7 @@ func cpCmd(c *cliconfig.CpValues) error {
return errors.Errorf("you must provide a source path and a destination path")
}
- runtime, err := libpodruntime.GetRuntime(&c.PodmanCommand)
+ runtime, err := libpodruntime.GetRuntime(getContext(), &c.PodmanCommand)
if err != nil {
return errors.Wrapf(err, "could not get runtime")
}
diff --git a/cmd/podman/create.go b/cmd/podman/create.go
index cfc0fa0c3..cb3ba14c5 100644
--- a/cmd/podman/create.go
+++ b/cmd/podman/create.go
@@ -52,7 +52,7 @@ func createCmd(c *cliconfig.CreateValues) error {
return err
}
- runtime, err := adapter.GetRuntime(&c.PodmanCommand)
+ runtime, err := adapter.GetRuntime(getContext(), &c.PodmanCommand)
if err != nil {
return errors.Wrapf(err, "error creating libpod runtime")
}
diff --git a/cmd/podman/diff.go b/cmd/podman/diff.go
index 1138c48a3..9543113d8 100644
--- a/cmd/podman/diff.go
+++ b/cmd/podman/diff.go
@@ -87,7 +87,7 @@ func diffCmd(c *cliconfig.DiffValues) error {
return errors.Errorf("container, image, or layer name must be specified: podman diff [options [...]] ID-NAME")
}
- runtime, err := adapter.GetRuntime(&c.PodmanCommand)
+ runtime, err := adapter.GetRuntime(getContext(), &c.PodmanCommand)
if err != nil {
return errors.Wrapf(err, "could not get runtime")
}
diff --git a/cmd/podman/events.go b/cmd/podman/events.go
index 4c11fe1f3..15f5e9571 100644
--- a/cmd/podman/events.go
+++ b/cmd/podman/events.go
@@ -40,7 +40,7 @@ func init() {
}
func eventsCmd(c *cliconfig.EventValues) error {
- runtime, err := adapter.GetRuntime(&c.PodmanCommand)
+ runtime, err := adapter.GetRuntime(getContext(), &c.PodmanCommand)
if err != nil {
return errors.Wrapf(err, "error creating libpod runtime")
}
diff --git a/cmd/podman/exec.go b/cmd/podman/exec.go
index d0d88ee8b..deff44a92 100644
--- a/cmd/podman/exec.go
+++ b/cmd/podman/exec.go
@@ -68,7 +68,7 @@ func execCmd(c *cliconfig.ExecValues) error {
argStart = 0
}
cmd := args[argStart:]
- runtime, err := libpodruntime.GetRuntime(&c.PodmanCommand)
+ runtime, err := libpodruntime.GetRuntime(getContext(), &c.PodmanCommand)
if err != nil {
return errors.Wrapf(err, "error creating libpod runtime")
}
diff --git a/cmd/podman/exists.go b/cmd/podman/exists.go
index dae48f14b..6619522b6 100644
--- a/cmd/podman/exists.go
+++ b/cmd/podman/exists.go
@@ -86,7 +86,7 @@ func imageExistsCmd(c *cliconfig.ImageExistsValues) error {
if len(args) > 1 || len(args) < 1 {
return errors.New("you may only check for the existence of one image at a time")
}
- runtime, err := adapter.GetRuntime(&c.PodmanCommand)
+ runtime, err := adapter.GetRuntime(getContext(), &c.PodmanCommand)
if err != nil {
return errors.Wrapf(err, "could not get runtime")
}
@@ -107,7 +107,7 @@ func containerExistsCmd(c *cliconfig.ContainerExistsValues) error {
if len(args) > 1 || len(args) < 1 {
return errors.New("you may only check for the existence of one container at a time")
}
- runtime, err := adapter.GetRuntime(&c.PodmanCommand)
+ runtime, err := adapter.GetRuntime(getContext(), &c.PodmanCommand)
if err != nil {
return errors.Wrapf(err, "could not get runtime")
}
@@ -126,7 +126,7 @@ func podExistsCmd(c *cliconfig.PodExistsValues) error {
if len(args) > 1 || len(args) < 1 {
return errors.New("you may only check for the existence of one pod at a time")
}
- runtime, err := adapter.GetRuntime(&c.PodmanCommand)
+ runtime, err := adapter.GetRuntime(getContext(), &c.PodmanCommand)
if err != nil {
return errors.Wrapf(err, "could not get runtime")
}
diff --git a/cmd/podman/export.go b/cmd/podman/export.go
index 004c3ccde..82a4c13e7 100644
--- a/cmd/podman/export.go
+++ b/cmd/podman/export.go
@@ -41,7 +41,7 @@ func init() {
// exportCmd saves a container to a tarball on disk
func exportCmd(c *cliconfig.ExportValues) error {
- runtime, err := adapter.GetRuntime(&c.PodmanCommand)
+ runtime, err := adapter.GetRuntime(getContext(), &c.PodmanCommand)
if err != nil {
return errors.Wrapf(err, "could not get runtime")
}
diff --git a/cmd/podman/generate_kube.go b/cmd/podman/generate_kube.go
index 7963cde6e..318dd0771 100644
--- a/cmd/podman/generate_kube.go
+++ b/cmd/podman/generate_kube.go
@@ -54,7 +54,7 @@ func generateKubeYAMLCmd(c *cliconfig.GenerateKubeValues) error {
return errors.Errorf("you must provide exactly one container|pod ID or name")
}
- runtime, err := adapter.GetRuntime(&c.PodmanCommand)
+ runtime, err := adapter.GetRuntime(getContext(), &c.PodmanCommand)
if err != nil {
return errors.Wrapf(err, "could not get runtime")
}
diff --git a/cmd/podman/healthcheck_run.go b/cmd/podman/healthcheck_run.go
index 832451e0c..111318d9c 100644
--- a/cmd/podman/healthcheck_run.go
+++ b/cmd/podman/healthcheck_run.go
@@ -38,7 +38,7 @@ func init() {
}
func healthCheckCmd(c *cliconfig.HealthCheckValues) error {
- runtime, err := adapter.GetRuntime(&c.PodmanCommand)
+ runtime, err := adapter.GetRuntime(getContext(), &c.PodmanCommand)
if err != nil {
return errors.Wrap(err, "could not get runtime")
}
diff --git a/cmd/podman/history.go b/cmd/podman/history.go
index f96d7934c..cebf99a9f 100644
--- a/cmd/podman/history.go
+++ b/cmd/podman/history.go
@@ -67,7 +67,7 @@ func init() {
}
func historyCmd(c *cliconfig.HistoryValues) error {
- runtime, err := adapter.GetRuntime(&c.PodmanCommand)
+ runtime, err := adapter.GetRuntime(getContext(), &c.PodmanCommand)
if err != nil {
return errors.Wrapf(err, "could not get runtime")
}
diff --git a/cmd/podman/images.go b/cmd/podman/images.go
index 41aa213a8..1c46571c3 100644
--- a/cmd/podman/images.go
+++ b/cmd/podman/images.go
@@ -134,7 +134,7 @@ func imagesCmd(c *cliconfig.ImagesValues) error {
image string
)
- runtime, err := adapter.GetRuntime(&c.PodmanCommand)
+ runtime, err := adapter.GetRuntime(getContext(), &c.PodmanCommand)
if err != nil {
return errors.Wrapf(err, "Could not get runtime")
}
diff --git a/cmd/podman/images_prune.go b/cmd/podman/images_prune.go
index c522c8b15..1ac5bc65d 100644
--- a/cmd/podman/images_prune.go
+++ b/cmd/podman/images_prune.go
@@ -37,7 +37,7 @@ func init() {
}
func pruneImagesCmd(c *cliconfig.PruneImagesValues) error {
- runtime, err := adapter.GetRuntime(&c.PodmanCommand)
+ runtime, err := adapter.GetRuntime(getContext(), &c.PodmanCommand)
if err != nil {
return errors.Wrapf(err, "could not get runtime")
}
diff --git a/cmd/podman/import.go b/cmd/podman/import.go
index 2bba6cb0c..167d9f2c9 100644
--- a/cmd/podman/import.go
+++ b/cmd/podman/import.go
@@ -45,7 +45,7 @@ func init() {
}
func importCmd(c *cliconfig.ImportValues) error {
- runtime, err := adapter.GetRuntime(&c.PodmanCommand)
+ runtime, err := adapter.GetRuntime(getContext(), &c.PodmanCommand)
if err != nil {
return errors.Wrapf(err, "could not get runtime")
}
diff --git a/cmd/podman/info.go b/cmd/podman/info.go
index 2b6ae1882..a6fce7fcb 100644
--- a/cmd/podman/info.go
+++ b/cmd/podman/info.go
@@ -50,7 +50,7 @@ func infoCmd(c *cliconfig.InfoValues) error {
info := map[string]interface{}{}
remoteClientInfo := map[string]interface{}{}
- runtime, err := adapter.GetRuntime(&c.PodmanCommand)
+ runtime, err := adapter.GetRuntime(getContext(), &c.PodmanCommand)
if err != nil {
return errors.Wrapf(err, "could not get runtime")
}
diff --git a/cmd/podman/inspect.go b/cmd/podman/inspect.go
index 9491bc7c7..4303c149c 100644
--- a/cmd/podman/inspect.go
+++ b/cmd/podman/inspect.go
@@ -84,7 +84,7 @@ func inspectCmd(c *cliconfig.InspectValues) error {
return errors.Errorf("you cannot provide additional arguments with --latest")
}
- runtime, err := adapter.GetRuntime(&c.PodmanCommand)
+ runtime, err := adapter.GetRuntime(getContext(), &c.PodmanCommand)
if err != nil {
return errors.Wrapf(err, "error creating libpod runtime")
}
diff --git a/cmd/podman/kill.go b/cmd/podman/kill.go
index 0513a154f..edf69ff2e 100644
--- a/cmd/podman/kill.go
+++ b/cmd/podman/kill.go
@@ -59,7 +59,7 @@ func killCmd(c *cliconfig.KillValues) error {
return err
}
- runtime, err := adapter.GetRuntime(&c.PodmanCommand)
+ runtime, err := adapter.GetRuntime(getContext(), &c.PodmanCommand)
if err != nil {
return errors.Wrapf(err, "could not get runtime")
}
diff --git a/cmd/podman/libpodruntime/runtime.go b/cmd/podman/libpodruntime/runtime.go
index 78adf1252..b03846bbc 100644
--- a/cmd/podman/libpodruntime/runtime.go
+++ b/cmd/podman/libpodruntime/runtime.go
@@ -1,6 +1,8 @@
package libpodruntime
import (
+ "context"
+
"github.com/containers/libpod/cmd/podman/cliconfig"
"github.com/containers/libpod/libpod"
"github.com/containers/libpod/pkg/rootless"
@@ -9,17 +11,22 @@ import (
"github.com/pkg/errors"
)
+// GetRuntimeMigrate gets a libpod runtime that will perform a migration of existing containers
+func GetRuntimeMigrate(ctx context.Context, c *cliconfig.PodmanCommand) (*libpod.Runtime, error) {
+ return getRuntime(ctx, c, false, true)
+}
+
// GetRuntimeRenumber gets a libpod runtime that will perform a lock renumber
-func GetRuntimeRenumber(c *cliconfig.PodmanCommand) (*libpod.Runtime, error) {
- return getRuntime(c, true)
+func GetRuntimeRenumber(ctx context.Context, c *cliconfig.PodmanCommand) (*libpod.Runtime, error) {
+ return getRuntime(ctx, c, true, false)
}
// GetRuntime generates a new libpod runtime configured by command line options
-func GetRuntime(c *cliconfig.PodmanCommand) (*libpod.Runtime, error) {
- return getRuntime(c, false)
+func GetRuntime(ctx context.Context, c *cliconfig.PodmanCommand) (*libpod.Runtime, error) {
+ return getRuntime(ctx, c, false, false)
}
-func getRuntime(c *cliconfig.PodmanCommand, renumber bool) (*libpod.Runtime, error) {
+func getRuntime(ctx context.Context, c *cliconfig.PodmanCommand, renumber bool, migrate bool) (*libpod.Runtime, error) {
options := []libpod.RuntimeOption{}
storageOpts := storage.StoreOptions{}
storageSet := false
@@ -63,11 +70,16 @@ func getRuntime(c *cliconfig.PodmanCommand, renumber bool) (*libpod.Runtime, err
storageSet = true
storageOpts.GraphDriverOptions = c.GlobalFlags.StorageOpts
}
+ if migrate {
+ options = append(options, libpod.WithMigrate())
+ }
if renumber {
options = append(options, libpod.WithRenumber())
}
+ options = append(options, libpod.WithContext(ctx))
+
// Only set this if the user changes storage config on the command line
if storageSet {
options = append(options, libpod.WithStorageConfig(storageOpts))
diff --git a/cmd/podman/load.go b/cmd/podman/load.go
index 3cc5e67c7..f3bbed48f 100644
--- a/cmd/podman/load.go
+++ b/cmd/podman/load.go
@@ -58,7 +58,7 @@ func loadCmd(c *cliconfig.LoadValues) error {
return errors.New("too many arguments. Requires exactly 1")
}
- runtime, err := adapter.GetRuntime(&c.PodmanCommand)
+ runtime, err := adapter.GetRuntime(getContext(), &c.PodmanCommand)
if err != nil {
return errors.Wrapf(err, "could not get runtime")
}
diff --git a/cmd/podman/logs.go b/cmd/podman/logs.go
index 6f24dc8fb..a1ec9f4ee 100644
--- a/cmd/podman/logs.go
+++ b/cmd/podman/logs.go
@@ -64,7 +64,7 @@ func init() {
func logsCmd(c *cliconfig.LogsValues) error {
var err error
- runtime, err := adapter.GetRuntime(&c.PodmanCommand)
+ runtime, err := adapter.GetRuntime(getContext(), &c.PodmanCommand)
if err != nil {
return errors.Wrapf(err, "could not get runtime")
}
diff --git a/cmd/podman/main_local.go b/cmd/podman/main_local.go
index 91ad42630..5afd51e28 100644
--- a/cmd/podman/main_local.go
+++ b/cmd/podman/main_local.go
@@ -103,7 +103,7 @@ func profileOff(cmd *cobra.Command) error {
}
func setupRootless(cmd *cobra.Command, args []string) error {
- if os.Geteuid() == 0 || cmd == _searchCommand || cmd == _versionCommand || cmd == _mountCommand || strings.HasPrefix(cmd.Use, "help") {
+ if os.Geteuid() == 0 || cmd == _searchCommand || cmd == _versionCommand || cmd == _mountCommand || cmd == _migrateCommand || strings.HasPrefix(cmd.Use, "help") {
return nil
}
podmanCmd := cliconfig.PodmanCommand{
@@ -112,7 +112,7 @@ func setupRootless(cmd *cobra.Command, args []string) error {
MainGlobalOpts,
remoteclient,
}
- runtime, err := libpodruntime.GetRuntime(&podmanCmd)
+ runtime, err := libpodruntime.GetRuntime(getContext(), &podmanCmd)
if err != nil {
return errors.Wrapf(err, "could not get runtime")
}
diff --git a/cmd/podman/mount.go b/cmd/podman/mount.go
index 2ade8949a..7c9150d1b 100644
--- a/cmd/podman/mount.go
+++ b/cmd/podman/mount.go
@@ -61,7 +61,7 @@ type jsonMountPoint struct {
}
func mountCmd(c *cliconfig.MountValues) error {
- runtime, err := libpodruntime.GetRuntime(&c.PodmanCommand)
+ runtime, err := libpodruntime.GetRuntime(getContext(), &c.PodmanCommand)
if err != nil {
return errors.Wrapf(err, "could not get runtime")
}
diff --git a/cmd/podman/pause.go b/cmd/podman/pause.go
index ca137150a..cd8370082 100644
--- a/cmd/podman/pause.go
+++ b/cmd/podman/pause.go
@@ -43,7 +43,7 @@ func pauseCmd(c *cliconfig.PauseValues) error {
return errors.New("pause is not supported for rootless containers")
}
- runtime, err := adapter.GetRuntime(&c.PodmanCommand)
+ runtime, err := adapter.GetRuntime(getContext(), &c.PodmanCommand)
if err != nil {
return errors.Wrapf(err, "could not get runtime")
}
diff --git a/cmd/podman/play_kube.go b/cmd/podman/play_kube.go
index d1008e615..967798399 100644
--- a/cmd/podman/play_kube.go
+++ b/cmd/podman/play_kube.go
@@ -75,7 +75,7 @@ func playKubeCmd(c *cliconfig.KubePlayValues) error {
}
ctx := getContext()
- runtime, err := libpodruntime.GetRuntime(&c.PodmanCommand)
+ runtime, err := libpodruntime.GetRuntime(ctx, &c.PodmanCommand)
if err != nil {
return errors.Wrapf(err, "could not get runtime")
}
diff --git a/cmd/podman/pod_create.go b/cmd/podman/pod_create.go
index 551010dce..c891f2c7b 100644
--- a/cmd/podman/pod_create.go
+++ b/cmd/podman/pod_create.go
@@ -62,7 +62,7 @@ func podCreateCmd(c *cliconfig.PodCreateValues) error {
podIdFile *os.File
)
- runtime, err := adapter.GetRuntime(&c.PodmanCommand)
+ runtime, err := adapter.GetRuntime(getContext(), &c.PodmanCommand)
if err != nil {
return errors.Wrapf(err, "error creating libpod runtime")
}
diff --git a/cmd/podman/pod_inspect.go b/cmd/podman/pod_inspect.go
index eb2366031..a22624078 100644
--- a/cmd/podman/pod_inspect.go
+++ b/cmd/podman/pod_inspect.go
@@ -49,7 +49,7 @@ func podInspectCmd(c *cliconfig.PodInspectValues) error {
return errors.Errorf("you must provide the name or id of a pod")
}
- runtime, err := adapter.GetRuntime(&c.PodmanCommand)
+ runtime, err := adapter.GetRuntime(getContext(), &c.PodmanCommand)
if err != nil {
return errors.Wrapf(err, "could not get runtime")
}
diff --git a/cmd/podman/pod_kill.go b/cmd/podman/pod_kill.go
index 145d0492f..c1ea66126 100644
--- a/cmd/podman/pod_kill.go
+++ b/cmd/podman/pod_kill.go
@@ -49,7 +49,7 @@ func init() {
// podKillCmd kills one or more pods with a signal
func podKillCmd(c *cliconfig.PodKillValues) error {
- runtime, err := adapter.GetRuntime(&c.PodmanCommand)
+ runtime, err := adapter.GetRuntime(getContext(), &c.PodmanCommand)
if err != nil {
return errors.Wrapf(err, "could not get runtime")
}
diff --git a/cmd/podman/pod_pause.go b/cmd/podman/pod_pause.go
index 1c6611ebc..e8574bfdc 100644
--- a/cmd/podman/pod_pause.go
+++ b/cmd/podman/pod_pause.go
@@ -45,7 +45,7 @@ func init() {
func podPauseCmd(c *cliconfig.PodPauseValues) error {
var lastError error
- runtime, err := adapter.GetRuntime(&c.PodmanCommand)
+ runtime, err := adapter.GetRuntime(getContext(), &c.PodmanCommand)
if err != nil {
return errors.Wrapf(err, "error creating libpod runtime")
}
diff --git a/cmd/podman/pod_ps.go b/cmd/podman/pod_ps.go
index f4b7437eb..b9dcbc05d 100644
--- a/cmd/podman/pod_ps.go
+++ b/cmd/podman/pod_ps.go
@@ -157,7 +157,7 @@ func podPsCmd(c *cliconfig.PodPsValues) error {
return errors.Wrapf(err, "error with flags passed")
}
- runtime, err := adapter.GetRuntime(&c.PodmanCommand)
+ runtime, err := adapter.GetRuntime(getContext(), &c.PodmanCommand)
if err != nil {
return errors.Wrapf(err, "error creating libpod runtime")
}
diff --git a/cmd/podman/pod_restart.go b/cmd/podman/pod_restart.go
index 519568974..a1f4c8359 100644
--- a/cmd/podman/pod_restart.go
+++ b/cmd/podman/pod_restart.go
@@ -47,7 +47,7 @@ func init() {
func podRestartCmd(c *cliconfig.PodRestartValues) error {
var lastError error
- runtime, err := adapter.GetRuntime(&c.PodmanCommand)
+ runtime, err := adapter.GetRuntime(getContext(), &c.PodmanCommand)
if err != nil {
return errors.Wrapf(err, "could not get runtime")
}
diff --git a/cmd/podman/pod_rm.go b/cmd/podman/pod_rm.go
index dd67bb0e0..218ed8154 100644
--- a/cmd/podman/pod_rm.go
+++ b/cmd/podman/pod_rm.go
@@ -47,7 +47,7 @@ func init() {
// podRmCmd deletes pods
func podRmCmd(c *cliconfig.PodRmValues) error {
- runtime, err := adapter.GetRuntime(&c.PodmanCommand)
+ runtime, err := adapter.GetRuntime(getContext(), &c.PodmanCommand)
if err != nil {
return errors.Wrapf(err, "could not get runtime")
}
diff --git a/cmd/podman/pod_start.go b/cmd/podman/pod_start.go
index 104f9ad73..5c9225428 100644
--- a/cmd/podman/pod_start.go
+++ b/cmd/podman/pod_start.go
@@ -45,7 +45,7 @@ func init() {
}
func podStartCmd(c *cliconfig.PodStartValues) error {
- runtime, err := adapter.GetRuntime(&c.PodmanCommand)
+ runtime, err := adapter.GetRuntime(getContext(), &c.PodmanCommand)
if err != nil {
return errors.Wrapf(err, "could not get runtime")
}
diff --git a/cmd/podman/pod_stats.go b/cmd/podman/pod_stats.go
index ed59d9a61..e0e5ca24e 100644
--- a/cmd/podman/pod_stats.go
+++ b/cmd/podman/pod_stats.go
@@ -78,7 +78,7 @@ func podStatsCmd(c *cliconfig.PodStatsValues) error {
all = true
}
- runtime, err := adapter.GetRuntime(&c.PodmanCommand)
+ runtime, err := adapter.GetRuntime(getContext(), &c.PodmanCommand)
if err != nil {
return errors.Wrapf(err, "could not get runtime")
}
diff --git a/cmd/podman/pod_stop.go b/cmd/podman/pod_stop.go
index 9cd425c29..b4b1718d9 100644
--- a/cmd/podman/pod_stop.go
+++ b/cmd/podman/pod_stop.go
@@ -47,7 +47,7 @@ func init() {
}
func podStopCmd(c *cliconfig.PodStopValues) error {
- runtime, err := adapter.GetRuntime(&c.PodmanCommand)
+ runtime, err := adapter.GetRuntime(getContext(), &c.PodmanCommand)
if err != nil {
return errors.Wrapf(err, "could not get runtime")
}
diff --git a/cmd/podman/pod_top.go b/cmd/podman/pod_top.go
index e997d1456..64e32318e 100644
--- a/cmd/podman/pod_top.go
+++ b/cmd/podman/pod_top.go
@@ -67,7 +67,7 @@ func podTopCmd(c *cliconfig.PodTopValues) error {
return errors.Errorf("you must provide the name or id of a running pod")
}
- runtime, err := adapter.GetRuntime(&c.PodmanCommand)
+ runtime, err := adapter.GetRuntime(getContext(), &c.PodmanCommand)
if err != nil {
return errors.Wrapf(err, "error creating libpod runtime")
}
diff --git a/cmd/podman/pod_unpause.go b/cmd/podman/pod_unpause.go
index 15375bee9..c5b7e6a18 100644
--- a/cmd/podman/pod_unpause.go
+++ b/cmd/podman/pod_unpause.go
@@ -46,7 +46,7 @@ func init() {
func podUnpauseCmd(c *cliconfig.PodUnpauseValues) error {
var lastError error
- runtime, err := adapter.GetRuntime(&c.PodmanCommand)
+ runtime, err := adapter.GetRuntime(getContext(), &c.PodmanCommand)
if err != nil {
return errors.Wrapf(err, "error creating libpod runtime")
}
diff --git a/cmd/podman/pods_prune.go b/cmd/podman/pods_prune.go
index e6946f068..bdd75f9de 100644
--- a/cmd/podman/pods_prune.go
+++ b/cmd/podman/pods_prune.go
@@ -36,7 +36,7 @@ func init() {
}
func podPruneCmd(c *cliconfig.PodPruneValues) error {
- runtime, err := adapter.GetRuntime(&c.PodmanCommand)
+ runtime, err := adapter.GetRuntime(getContext(), &c.PodmanCommand)
if err != nil {
return errors.Wrapf(err, "could not get runtime")
}
diff --git a/cmd/podman/port.go b/cmd/podman/port.go
index d63ae4aa9..7a9f01fe6 100644
--- a/cmd/podman/port.go
+++ b/cmd/podman/port.go
@@ -98,7 +98,7 @@ func portCmd(c *cliconfig.PortValues) error {
}
}
- runtime, err := libpodruntime.GetRuntime(&c.PodmanCommand)
+ runtime, err := libpodruntime.GetRuntime(getContext(), &c.PodmanCommand)
if err != nil {
return errors.Wrapf(err, "could not get runtime")
}
diff --git a/cmd/podman/ps.go b/cmd/podman/ps.go
index df1ea2765..623f17050 100644
--- a/cmd/podman/ps.go
+++ b/cmd/podman/ps.go
@@ -211,7 +211,7 @@ func psCmd(c *cliconfig.PsValues) error {
return errors.Wrapf(err, "error with flags passed")
}
- runtime, err := adapter.GetRuntime(&c.PodmanCommand)
+ runtime, err := adapter.GetRuntime(getContext(), &c.PodmanCommand)
if err != nil {
return errors.Wrapf(err, "error creating libpod runtime")
}
diff --git a/cmd/podman/pull.go b/cmd/podman/pull.go
index 521419e7a..f6a5beb17 100644
--- a/cmd/podman/pull.go
+++ b/cmd/podman/pull.go
@@ -73,7 +73,7 @@ func pullCmd(c *cliconfig.PullValues) (retError error) {
defer span.Finish()
}
- runtime, err := adapter.GetRuntime(&c.PodmanCommand)
+ runtime, err := adapter.GetRuntime(getContext(), &c.PodmanCommand)
if err != nil {
return errors.Wrapf(err, "could not get runtime")
diff --git a/cmd/podman/push.go b/cmd/podman/push.go
index e6beaaeb4..ee14b15e2 100644
--- a/cmd/podman/push.go
+++ b/cmd/podman/push.go
@@ -100,7 +100,7 @@ func pushCmd(c *cliconfig.PushValues) error {
registryCreds = creds
}
- runtime, err := adapter.GetRuntime(&c.PodmanCommand)
+ runtime, err := adapter.GetRuntime(getContext(), &c.PodmanCommand)
if err != nil {
return errors.Wrapf(err, "could not create runtime")
}
diff --git a/cmd/podman/refresh.go b/cmd/podman/refresh.go
index 6640d9954..9f9cbf908 100644
--- a/cmd/podman/refresh.go
+++ b/cmd/podman/refresh.go
@@ -38,7 +38,7 @@ func init() {
}
func refreshCmd(c *cliconfig.RefreshValues) error {
- runtime, err := libpodruntime.GetRuntime(&c.PodmanCommand)
+ runtime, err := libpodruntime.GetRuntime(getContext(), &c.PodmanCommand)
if err != nil {
return errors.Wrapf(err, "error creating libpod runtime")
}
diff --git a/cmd/podman/restart.go b/cmd/podman/restart.go
index 9ab2dd528..437676eef 100644
--- a/cmd/podman/restart.go
+++ b/cmd/podman/restart.go
@@ -51,7 +51,7 @@ func restartCmd(c *cliconfig.RestartValues) error {
return errors.Wrapf(libpod.ErrInvalidArg, "you must provide at least one container name or ID")
}
- runtime, err := adapter.GetRuntime(&c.PodmanCommand)
+ runtime, err := adapter.GetRuntime(getContext(), &c.PodmanCommand)
if err != nil {
return errors.Wrapf(err, "error creating libpod runtime")
}
diff --git a/cmd/podman/restore.go b/cmd/podman/restore.go
index d9e85c267..8cfd5ca0d 100644
--- a/cmd/podman/restore.go
+++ b/cmd/podman/restore.go
@@ -54,7 +54,7 @@ func restoreCmd(c *cliconfig.RestoreValues) error {
return errors.New("restoring a container requires root")
}
- runtime, err := adapter.GetRuntime(&c.PodmanCommand)
+ runtime, err := adapter.GetRuntime(getContext(), &c.PodmanCommand)
if err != nil {
return errors.Wrapf(err, "could not get runtime")
}
diff --git a/cmd/podman/rm.go b/cmd/podman/rm.go
index e3ee186ce..1bf56b782 100644
--- a/cmd/podman/rm.go
+++ b/cmd/podman/rm.go
@@ -48,7 +48,7 @@ func init() {
// rmCmd removes one or more containers
func rmCmd(c *cliconfig.RmValues) error {
- runtime, err := adapter.GetRuntime(&c.PodmanCommand)
+ runtime, err := adapter.GetRuntime(getContext(), &c.PodmanCommand)
if err != nil {
return errors.Wrapf(err, "could not get runtime")
}
diff --git a/cmd/podman/rmi.go b/cmd/podman/rmi.go
index be7c81dab..4c41a3ad5 100644
--- a/cmd/podman/rmi.go
+++ b/cmd/podman/rmi.go
@@ -51,7 +51,7 @@ func rmiCmd(c *cliconfig.RmiValues) error {
ctx := getContext()
removeAll := c.All
- runtime, err := adapter.GetRuntime(&c.PodmanCommand)
+ runtime, err := adapter.GetRuntime(getContext(), &c.PodmanCommand)
if err != nil {
return errors.Wrapf(err, "could not get runtime")
}
diff --git a/cmd/podman/run.go b/cmd/podman/run.go
index 717a36e04..01b12d282 100644
--- a/cmd/podman/run.go
+++ b/cmd/podman/run.go
@@ -48,7 +48,7 @@ func runCmd(c *cliconfig.RunValues) error {
return err
}
- runtime, err := adapter.GetRuntime(&c.PodmanCommand)
+ runtime, err := adapter.GetRuntime(getContext(), &c.PodmanCommand)
if err != nil {
return errors.Wrapf(err, "error creating libpod runtime")
}
diff --git a/cmd/podman/runlabel.go b/cmd/podman/runlabel.go
index 8267e941f..f097cb693 100644
--- a/cmd/podman/runlabel.go
+++ b/cmd/podman/runlabel.go
@@ -85,7 +85,7 @@ func runlabelCmd(c *cliconfig.RunlabelValues) error {
}
opts := make(map[string]string)
- runtime, err := libpodruntime.GetRuntime(&c.PodmanCommand)
+ runtime, err := libpodruntime.GetRuntime(getContext(), &c.PodmanCommand)
if err != nil {
return errors.Wrapf(err, "could not get runtime")
}
diff --git a/cmd/podman/save.go b/cmd/podman/save.go
index a45223b6a..4d204337e 100644
--- a/cmd/podman/save.go
+++ b/cmd/podman/save.go
@@ -70,7 +70,7 @@ func saveCmd(c *cliconfig.SaveValues) error {
return errors.Errorf("need at least 1 argument")
}
- runtime, err := adapter.GetRuntime(&c.PodmanCommand)
+ runtime, err := adapter.GetRuntime(getContext(), &c.PodmanCommand)
if err != nil {
return errors.Wrapf(err, "could not create runtime")
}
diff --git a/cmd/podman/sign.go b/cmd/podman/sign.go
index b19b6a840..0c25eec62 100644
--- a/cmd/podman/sign.go
+++ b/cmd/podman/sign.go
@@ -56,7 +56,7 @@ func signCmd(c *cliconfig.SignValues) error {
if len(args) < 1 {
return errors.Errorf("at least one image name must be specified")
}
- runtime, err := libpodruntime.GetRuntime(&c.PodmanCommand)
+ runtime, err := libpodruntime.GetRuntime(getContext(), &c.PodmanCommand)
if err != nil {
return errors.Wrapf(err, "could not create runtime")
}
diff --git a/cmd/podman/start.go b/cmd/podman/start.go
index 9f93061f9..bd34010f2 100644
--- a/cmd/podman/start.go
+++ b/cmd/podman/start.go
@@ -65,7 +65,7 @@ func startCmd(c *cliconfig.StartValues) error {
return errors.Wrapf(libpod.ErrInvalidArg, "you cannot use sig-proxy without --attach")
}
- runtime, err := adapter.GetRuntime(&c.PodmanCommand)
+ runtime, err := adapter.GetRuntime(getContext(), &c.PodmanCommand)
if err != nil {
return errors.Wrapf(err, "error creating libpod runtime")
}
diff --git a/cmd/podman/stats.go b/cmd/podman/stats.go
index 6aa0cc10c..c2b2a688c 100644
--- a/cmd/podman/stats.go
+++ b/cmd/podman/stats.go
@@ -88,7 +88,7 @@ func statsCmd(c *cliconfig.StatsValues) error {
return errors.Errorf("you must specify --all, --latest, or at least one container")
}
- runtime, err := libpodruntime.GetRuntime(&c.PodmanCommand)
+ runtime, err := libpodruntime.GetRuntime(getContext(), &c.PodmanCommand)
if err != nil {
return errors.Wrapf(err, "could not get runtime")
}
diff --git a/cmd/podman/stop.go b/cmd/podman/stop.go
index f263bb166..d88c90deb 100644
--- a/cmd/podman/stop.go
+++ b/cmd/podman/stop.go
@@ -56,7 +56,7 @@ func stopCmd(c *cliconfig.StopValues) error {
defer span.Finish()
}
- runtime, err := adapter.GetRuntime(&c.PodmanCommand)
+ runtime, err := adapter.GetRuntime(getContext(), &c.PodmanCommand)
if err != nil {
return errors.Wrapf(err, "could not get runtime")
}
diff --git a/cmd/podman/system_df.go b/cmd/podman/system_df.go
index aa0ead022..840916547 100644
--- a/cmd/podman/system_df.go
+++ b/cmd/podman/system_df.go
@@ -99,7 +99,7 @@ func init() {
}
func dfSystemCmd(c *cliconfig.SystemDfValues) error {
- runtime, err := libpodruntime.GetRuntime(&c.PodmanCommand)
+ runtime, err := libpodruntime.GetRuntime(getContext(), &c.PodmanCommand)
if err != nil {
return errors.Wrapf(err, "Could not get runtime")
}
diff --git a/cmd/podman/system_migrate.go b/cmd/podman/system_migrate.go
new file mode 100644
index 000000000..4a0afcfad
--- /dev/null
+++ b/cmd/podman/system_migrate.go
@@ -0,0 +1,50 @@
+package main
+
+import (
+ "github.com/containers/libpod/cmd/podman/cliconfig"
+ "github.com/containers/libpod/cmd/podman/libpodruntime"
+ "github.com/pkg/errors"
+ "github.com/spf13/cobra"
+)
+
+var (
+ migrateCommand cliconfig.SystemMigrateValues
+ migrateDescription = `
+ podman system migrate
+
+ Migrate existing containers to a new version of Podman.
+`
+
+ _migrateCommand = &cobra.Command{
+ Use: "migrate",
+ Args: noSubArgs,
+ Short: "Migrate containers",
+ Long: migrateDescription,
+ RunE: func(cmd *cobra.Command, args []string) error {
+ migrateCommand.InputArgs = args
+ migrateCommand.GlobalFlags = MainGlobalOpts
+ return migrateCmd(&migrateCommand)
+ },
+ }
+)
+
+func init() {
+ migrateCommand.Command = _migrateCommand
+ migrateCommand.SetHelpTemplate(HelpTemplate())
+ migrateCommand.SetUsageTemplate(UsageTemplate())
+}
+
+func migrateCmd(c *cliconfig.SystemMigrateValues) error {
+ // We need to pass one extra option to NewRuntime.
+ // This will inform the OCI runtime to start a migrate.
+ // That's controlled by the last argument to GetRuntime.
+ r, err := libpodruntime.GetRuntimeMigrate(getContext(), &c.PodmanCommand)
+ if err != nil {
+ return errors.Wrapf(err, "error migrating containers")
+ }
+ if err := r.Shutdown(false); err != nil {
+ return err
+ }
+
+ return nil
+}
diff --git a/cmd/podman/system_prune.go b/cmd/podman/system_prune.go
index 2c1c5607a..8a648b603 100644
--- a/cmd/podman/system_prune.go
+++ b/cmd/podman/system_prune.go
@@ -72,7 +72,7 @@ Are you sure you want to continue? [y/N] `, volumeString)
}
}
- runtime, err := adapter.GetRuntime(&c.PodmanCommand)
+ runtime, err := adapter.GetRuntime(getContext(), &c.PodmanCommand)
if err != nil {
return errors.Wrapf(err, "could not get runtime")
}
diff --git a/cmd/podman/system_renumber.go b/cmd/podman/system_renumber.go
index 70ba706bb..81752a177 100644
--- a/cmd/podman/system_renumber.go
+++ b/cmd/podman/system_renumber.go
@@ -40,7 +40,7 @@ func renumberCmd(c *cliconfig.SystemRenumberValues) error {
// We need to pass one extra option to NewRuntime.
// This will inform the OCI runtime to start a renumber.
// That's controlled by the last argument to GetRuntime.
- r, err := libpodruntime.GetRuntimeRenumber(&c.PodmanCommand)
+ r, err := libpodruntime.GetRuntimeRenumber(getContext(), &c.PodmanCommand)
if err != nil {
return errors.Wrapf(err, "error renumbering locks")
}
diff --git a/cmd/podman/tag.go b/cmd/podman/tag.go
index deda4e985..58f221e26 100644
--- a/cmd/podman/tag.go
+++ b/cmd/podman/tag.go
@@ -38,7 +38,7 @@ func tagCmd(c *cliconfig.TagValues) error {
if len(args) < 2 {
return errors.Errorf("image name and at least one new name must be specified")
}
- runtime, err := adapter.GetRuntime(&c.PodmanCommand)
+ runtime, err := adapter.GetRuntime(getContext(), &c.PodmanCommand)
if err != nil {
return errors.Wrapf(err, "could not create runtime")
}
diff --git a/cmd/podman/top.go b/cmd/podman/top.go
index f1f594ebf..2e0a22d92 100644
--- a/cmd/podman/top.go
+++ b/cmd/podman/top.go
@@ -76,7 +76,7 @@ func topCmd(c *cliconfig.TopValues) error {
return errors.Errorf("you must provide the name or id of a running container")
}
- runtime, err := adapter.GetRuntime(&c.PodmanCommand)
+ runtime, err := adapter.GetRuntime(getContext(), &c.PodmanCommand)
if err != nil {
return errors.Wrapf(err, "error creating libpod runtime")
}
diff --git a/cmd/podman/tree.go b/cmd/podman/tree.go
index f205c83e4..6490c609d 100644
--- a/cmd/podman/tree.go
+++ b/cmd/podman/tree.go
@@ -51,7 +51,7 @@ func treeCmd(c *cliconfig.TreeValues) error {
return errors.Errorf("you must provide at most 1 argument")
}
- runtime, err := adapter.GetRuntime(&c.PodmanCommand)
+ runtime, err := adapter.GetRuntime(getContext(), &c.PodmanCommand)
if err != nil {
return errors.Wrapf(err, "error creating libpod runtime")
}
diff --git a/cmd/podman/trust_set_show.go b/cmd/podman/trust_set_show.go
index 580331673..b615f6266 100644
--- a/cmd/podman/trust_set_show.go
+++ b/cmd/podman/trust_set_show.go
@@ -74,7 +74,7 @@ File(s) must exist before using this command`)
}
func showTrustCmd(c *cliconfig.ShowTrustValues) error {
- runtime, err := libpodruntime.GetRuntime(&c.PodmanCommand)
+ runtime, err := libpodruntime.GetRuntime(getContext(), &c.PodmanCommand)
if err != nil {
return errors.Wrapf(err, "could not create runtime")
}
@@ -131,7 +131,7 @@ func showTrustCmd(c *cliconfig.ShowTrustValues) error {
}
func setTrustCmd(c *cliconfig.SetTrustValues) error {
- runtime, err := libpodruntime.GetRuntime(&c.PodmanCommand)
+ runtime, err := libpodruntime.GetRuntime(getContext(), &c.PodmanCommand)
if err != nil {
return errors.Wrapf(err, "could not create runtime")
}
diff --git a/cmd/podman/umount.go b/cmd/podman/umount.go
index cdf8b951a..ddbd00bd5 100644
--- a/cmd/podman/umount.go
+++ b/cmd/podman/umount.go
@@ -48,7 +48,7 @@ func init() {
}
func umountCmd(c *cliconfig.UmountValues) error {
- runtime, err := adapter.GetRuntime(&c.PodmanCommand)
+ runtime, err := adapter.GetRuntime(getContext(), &c.PodmanCommand)
if err != nil {
return errors.Wrapf(err, "error creating runtime")
}
diff --git a/cmd/podman/unpause.go b/cmd/podman/unpause.go
index fa946bfd7..2cd6846fe 100644
--- a/cmd/podman/unpause.go
+++ b/cmd/podman/unpause.go
@@ -42,7 +42,7 @@ func unpauseCmd(c *cliconfig.UnpauseValues) error {
return errors.New("unpause is not supported for rootless containers")
}
- runtime, err := adapter.GetRuntime(&c.PodmanCommand)
+ runtime, err := adapter.GetRuntime(getContext(), &c.PodmanCommand)
if err != nil {
return errors.Wrapf(err, "could not get runtime")
}
diff --git a/cmd/podman/varlink.go b/cmd/podman/varlink.go
index 787ad01cd..978678a84 100644
--- a/cmd/podman/varlink.go
+++ b/cmd/podman/varlink.go
@@ -55,7 +55,7 @@ func varlinkCmd(c *cliconfig.VarlinkValues) error {
timeout := time.Duration(c.Timeout) * time.Millisecond
// Create a single runtime for varlink
- runtime, err := libpodruntime.GetRuntime(&c.PodmanCommand)
+ runtime, err := libpodruntime.GetRuntime(getContext(), &c.PodmanCommand)
if err != nil {
return errors.Wrapf(err, "error creating libpod runtime")
}
diff --git a/cmd/podman/volume_create.go b/cmd/podman/volume_create.go
index 2b10adb2b..84f6bba94 100644
--- a/cmd/podman/volume_create.go
+++ b/cmd/podman/volume_create.go
@@ -42,7 +42,7 @@ func init() {
}
func volumeCreateCmd(c *cliconfig.VolumeCreateValues) error {
- runtime, err := adapter.GetRuntime(&c.PodmanCommand)
+ runtime, err := adapter.GetRuntime(getContext(), &c.PodmanCommand)
if err != nil {
return errors.Wrapf(err, "error creating libpod runtime")
}
diff --git a/cmd/podman/volume_inspect.go b/cmd/podman/volume_inspect.go
index 66d394307..e4b05f96a 100644
--- a/cmd/podman/volume_inspect.go
+++ b/cmd/podman/volume_inspect.go
@@ -43,7 +43,7 @@ func volumeInspectCmd(c *cliconfig.VolumeInspectValues) error {
return errors.New("provide one or more volume names or use --all")
}
- runtime, err := adapter.GetRuntime(&c.PodmanCommand)
+ runtime, err := adapter.GetRuntime(getContext(), &c.PodmanCommand)
if err != nil {
return errors.Wrapf(err, "error creating libpod runtime")
}
diff --git a/cmd/podman/volume_ls.go b/cmd/podman/volume_ls.go
index b9ab89196..581e595cb 100644
--- a/cmd/podman/volume_ls.go
+++ b/cmd/podman/volume_ls.go
@@ -72,7 +72,7 @@ func init() {
}
func volumeLsCmd(c *cliconfig.VolumeLsValues) error {
- runtime, err := adapter.GetRuntime(&c.PodmanCommand)
+ runtime, err := adapter.GetRuntime(getContext(), &c.PodmanCommand)
if err != nil {
return errors.Wrapf(err, "error creating libpod runtime")
}
diff --git a/cmd/podman/volume_prune.go b/cmd/podman/volume_prune.go
index ad62bfc22..6dc9e2403 100644
--- a/cmd/podman/volume_prune.go
+++ b/cmd/podman/volume_prune.go
@@ -63,7 +63,7 @@ func volumePrune(runtime *adapter.LocalRuntime, ctx context.Context) error {
}
func volumePruneCmd(c *cliconfig.VolumePruneValues) error {
- runtime, err := adapter.GetRuntime(&c.PodmanCommand)
+ runtime, err := adapter.GetRuntime(getContext(), &c.PodmanCommand)
if err != nil {
return errors.Wrapf(err, "error creating libpod runtime")
}
diff --git a/cmd/podman/volume_rm.go b/cmd/podman/volume_rm.go
index 4534019c6..77137eb7a 100644
--- a/cmd/podman/volume_rm.go
+++ b/cmd/podman/volume_rm.go
@@ -47,7 +47,7 @@ func volumeRmCmd(c *cliconfig.VolumeRmValues) error {
return errors.New("choose either one or more volumes or all")
}
- runtime, err := adapter.GetRuntime(&c.PodmanCommand)
+ runtime, err := adapter.GetRuntime(getContext(), &c.PodmanCommand)
if err != nil {
return errors.Wrapf(err, "error creating libpod runtime")
}
diff --git a/cmd/podman/wait.go b/cmd/podman/wait.go
index 97ec75b0c..380e861ed 100644
--- a/cmd/podman/wait.go
+++ b/cmd/podman/wait.go
@@ -51,7 +51,7 @@ func waitCmd(c *cliconfig.WaitValues) error {
}
interval := time.Duration(c.Interval) * time.Millisecond
- runtime, err := adapter.GetRuntime(&c.PodmanCommand)
+ runtime, err := adapter.GetRuntime(getContext(), &c.PodmanCommand)
if err != nil {
return errors.Wrapf(err, "error creating runtime")
}
diff --git a/docs/podman-system-migrate.1.md b/docs/podman-system-migrate.1.md
new file mode 100644
index 000000000..7c2d1823c
--- /dev/null
+++ b/docs/podman-system-migrate.1.md
@@ -0,0 +1,21 @@
+% podman-system-migrate(1) podman
+
+## NAME
+podman\-system\-migrate - Migrate container to the latest version of podman
+
+## SYNOPSIS
+** podman system migrate**
+
+## DESCRIPTION
+** podman system migrate** migrates containers to the latest podman version.
+
+**podman system migrate** takes care of migrating existing containers to the latest version of podman if any change is necessary.
+
+## SYNOPSIS
+**podman system migrate**
+
+## SEE ALSO
+`podman(1)`, `libpod.conf(5)`
+
+# HISTORY
+April 2019, Originally compiled by Giuseppe Scrivano (gscrivan at redhat dot com)
diff --git a/docs/podman-system.1.md b/docs/podman-system.1.md
index 32b3efdd9..d36715feb 100644
--- a/docs/podman-system.1.md
+++ b/docs/podman-system.1.md
@@ -17,6 +17,7 @@ The system command allows you to manage the podman systems
| info | [podman-system-info(1)](podman-info.1.md) | Displays Podman related system information. |
| prune | [podman-system-prune(1)](podman-system-prune.1.md) | Remove all unused data |
| renumber | [podman-system-renumber(1)](podman-system-renumber.1.md)| Migrate lock numbers to handle a change in maximum number of locks. |
+| migrate | [podman-system-migrate(1)](podman-system-migrate.1.md)| Migrate existing containers to a new podman version. |
## SEE ALSO
podman(1)
diff --git a/libpod/options.go b/libpod/options.go
index 8038f1935..9932d5453 100644
--- a/libpod/options.go
+++ b/libpod/options.go
@@ -1,6 +1,7 @@
package libpod
import (
+ "context"
"net"
"os"
"path/filepath"
@@ -436,6 +437,22 @@ func WithRenumber() RuntimeOption {
}
}
+// WithMigrate instructs libpod to perform a lock migrateing while
+// initializing. This will handle migrations from early versions of libpod with
+// file locks to newer versions with SHM locking, as well as changes in the
+// number of configured locks.
+func WithMigrate() RuntimeOption {
+ return func(rt *Runtime) error {
+ if rt.valid {
+ return ErrRuntimeFinalized
+ }
+
+ rt.doMigrate = true
+
+ return nil
+ }
+}
+
// Container Creation Options
// WithShmDir sets the directory that should be mounted on /dev/shm.
@@ -450,6 +467,19 @@ func WithShmDir(dir string) CtrCreateOption {
}
}
+// WithContext sets the context to use.
+func WithContext(ctx context.Context) RuntimeOption {
+ return func(rt *Runtime) error {
+ if rt.valid {
+ return ErrRuntimeFinalized
+ }
+
+ rt.ctx = ctx
+
+ return nil
+ }
+}
+
// WithSystemd turns on systemd mode in the container
func WithSystemd() CtrCreateOption {
return func(ctr *Container) error {
diff --git a/libpod/runtime.go b/libpod/runtime.go
index 69cc10389..e85242028 100644
--- a/libpod/runtime.go
+++ b/libpod/runtime.go
@@ -1,6 +1,7 @@
package libpod
import (
+ "context"
"fmt"
"io/ioutil"
"os"
@@ -100,6 +101,8 @@ type Runtime struct {
// unused.
doRenumber bool
+ doMigrate bool
+
// valid indicates whether the runtime is ready to use.
// valid is set to true when a runtime is returned from GetRuntime(),
// and remains true until the runtime is shut down (rendering its
@@ -109,6 +112,8 @@ type Runtime struct {
// mechanism to read and write even logs
eventer events.Eventer
+
+ ctx context.Context
}
// OCIRuntimePath contains information about an OCI runtime.
@@ -962,6 +967,24 @@ func makeRuntime(runtime *Runtime) (err error) {
// further
runtime.valid = true
+ if runtime.doMigrate {
+ if os.Geteuid() != 0 {
+ aliveLock.Unlock()
+ locked = false
+
+ became, ret, err := rootless.BecomeRootInUserNS()
+ if err != nil {
+ return err
+ }
+ if became {
+ os.Exit(ret)
+ }
+ }
+ if err := runtime.migrate(); err != nil {
+ return err
+ }
+ }
+
return nil
}
diff --git a/libpod/runtime_migrate.go b/libpod/runtime_migrate.go
new file mode 100644
index 000000000..a084df289
--- /dev/null
+++ b/libpod/runtime_migrate.go
@@ -0,0 +1,47 @@
+package libpod
+
+import (
+ "path/filepath"
+
+ "github.com/pkg/errors"
+ "github.com/sirupsen/logrus"
+)
+
+func (r *Runtime) migrate() error {
+ runningContainers, err := r.GetRunningContainers()
+ if err != nil {
+ return err
+ }
+
+ allCtrs, err := r.state.AllContainers()
+ if err != nil {
+ return err
+ }
+
+ logrus.Infof("stopping all containers")
+ for _, ctr := range runningContainers {
+ logrus.Infof("stopping %s", ctr.ID())
+ if err := ctr.Stop(); err != nil {
+ return errors.Wrapf(err, "cannot stop container %s", ctr.ID())
+ }
+ }
+
+ for _, ctr := range allCtrs {
+ oldLocation := filepath.Join(ctr.state.RunDir, "conmon.pid")
+ if ctr.config.ConmonPidFile == oldLocation {
+ logrus.Infof("changing conmon PID file for %s", ctr.ID())
+ ctr.config.ConmonPidFile = filepath.Join(ctr.config.StaticDir, "conmon.pid")
+ if err := r.state.RewriteContainerConfig(ctr, ctr.config); err != nil {
+ return errors.Wrapf(err, "error rewriting config for container %s", ctr.ID())
+ }
+ }
+ }
+
+ for _, ctr := range runningContainers {
+ if err := ctr.Start(r.ctx, true); err != nil {
+ logrus.Errorf("error restarting container %s", ctr.ID())
+ }
+ }
+
+ return nil
+}
diff --git a/pkg/adapter/runtime.go b/pkg/adapter/runtime.go
index 790ed5c89..0d840d65b 100644
--- a/pkg/adapter/runtime.go
+++ b/pkg/adapter/runtime.go
@@ -57,8 +57,8 @@ type Volume struct {
type VolumeFilter func(*Volume) bool
// GetRuntime returns a LocalRuntime struct with the actual runtime embedded in it
-func GetRuntime(c *cliconfig.PodmanCommand) (*LocalRuntime, error) {
- runtime, err := libpodruntime.GetRuntime(c)
+func GetRuntime(ctx context.Context, c *cliconfig.PodmanCommand) (*LocalRuntime, error) {
+ runtime, err := libpodruntime.GetRuntime(ctx, c)
if err != nil {
return nil, err
}
diff --git a/pkg/adapter/runtime_remote.go b/pkg/adapter/runtime_remote.go
index 29ee821e0..6102daccf 100644
--- a/pkg/adapter/runtime_remote.go
+++ b/pkg/adapter/runtime_remote.go
@@ -46,7 +46,7 @@ type LocalRuntime struct {
}
// GetRuntime returns a LocalRuntime struct with the actual runtime embedded in it
-func GetRuntime(c *cliconfig.PodmanCommand) (*LocalRuntime, error) {
+func GetRuntime(ctx context.Context, c *cliconfig.PodmanCommand) (*LocalRuntime, error) {
runtime := RemoteRuntime{}
conn, err := runtime.Connect()
if err != nil {