1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79
|
//go:build !remote
// +build !remote
package system
import (
"fmt"
"os"
"github.com/containers/common/pkg/completion"
"github.com/containers/podman/v4/cmd/podman/registry"
"github.com/containers/podman/v4/cmd/podman/validate"
"github.com/containers/podman/v4/libpod/define"
"github.com/containers/podman/v4/pkg/domain/entities"
"github.com/containers/podman/v4/pkg/domain/infra"
"github.com/spf13/cobra"
)
var (
migrateDescription = `
podman system migrate
Migrate existing containers to a new version of Podman.
`
migrateCommand = &cobra.Command{
Annotations: map[string]string{
registry.EngineMode: registry.ABIMode,
registry.NoMoveProcess: registry.NoMoveProcess,
},
Use: "migrate [options]",
Args: validate.NoArgs,
Short: "Migrate containers",
Long: migrateDescription,
Run: migrate,
ValidArgsFunction: completion.AutocompleteNone,
}
)
var (
migrateOptions entities.SystemMigrateOptions
)
func init() {
registry.Commands = append(registry.Commands, registry.CliCommand{
Command: migrateCommand,
Parent: systemCmd,
})
flags := migrateCommand.Flags()
newRuntimeFlagName := "new-runtime"
flags.StringVar(&migrateOptions.NewRuntime, newRuntimeFlagName, "", "Specify a new runtime for all containers")
_ = migrateCommand.RegisterFlagCompletionFunc(newRuntimeFlagName, completion.AutocompleteNone)
}
func migrate(cmd *cobra.Command, args []string) {
// Shutdown all running engines, `renumber` will hijack repository
registry.ContainerEngine().Shutdown(registry.Context())
registry.ImageEngine().Shutdown(registry.Context())
engine, err := infra.NewSystemEngine(entities.MigrateMode, registry.PodmanConfig())
if err != nil {
fmt.Println(err)
os.Exit(define.ExecErrorCodeGeneric)
}
defer engine.Shutdown(registry.Context())
err = engine.Migrate(registry.Context(), cmd.Flags(), registry.PodmanConfig(), migrateOptions)
if err != nil {
fmt.Println(err)
// FIXME change this to return the error like other commands
// defer will never run on os.Exit()
//nolint:gocritic
os.Exit(define.ExecErrorCodeGeneric)
}
os.Exit(0)
}
|