mirror of
https://github.com/containers/podman.git
synced 2025-12-04 20:28:40 +08:00
Merge pull request #4221 from mheon/reset_runtime
Migrate can move containers to a user-defined runtime
This commit is contained in:
@@ -463,6 +463,28 @@ func WithMigrate() RuntimeOption {
|
||||
}
|
||||
}
|
||||
|
||||
// WithMigrateRuntime instructs Libpod to change the default OCI runtime on all
|
||||
// containers during a migration. This is not used if `MigrateRuntime()` is not
|
||||
// also passed.
|
||||
// Libpod makes no promises that your containers continue to work with the new
|
||||
// runtime - migrations between dissimilar runtimes may well break things.
|
||||
// Use with caution.
|
||||
func WithMigrateRuntime(requestedRuntime string) RuntimeOption {
|
||||
return func(rt *Runtime) error {
|
||||
if rt.valid {
|
||||
return define.ErrRuntimeFinalized
|
||||
}
|
||||
|
||||
if requestedRuntime == "" {
|
||||
return errors.Wrapf(define.ErrInvalidArg, "must provide a non-empty name for new runtime")
|
||||
}
|
||||
|
||||
rt.migrateRuntime = requestedRuntime
|
||||
|
||||
return nil
|
||||
}
|
||||
}
|
||||
|
||||
// WithEventsLogger sets the events backend to use.
|
||||
// Currently supported values are "file" for file backend and "journald" for
|
||||
// journald backend.
|
||||
|
||||
@@ -114,6 +114,10 @@ type Runtime struct {
|
||||
doRenumber bool
|
||||
|
||||
doMigrate bool
|
||||
// System migrate can move containers to a new runtime.
|
||||
// We make no promises that these migrated containers work on the new
|
||||
// runtime, though.
|
||||
migrateRuntime string
|
||||
|
||||
// valid indicates whether the runtime is ready to use.
|
||||
// valid is set to true when a runtime is returned from GetRuntime(),
|
||||
|
||||
@@ -5,14 +5,15 @@ package libpod
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"github.com/containers/libpod/pkg/util"
|
||||
"io/ioutil"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"strconv"
|
||||
"syscall"
|
||||
|
||||
"github.com/containers/libpod/libpod/define"
|
||||
"github.com/containers/libpod/pkg/rootless"
|
||||
"github.com/containers/libpod/pkg/util"
|
||||
"github.com/pkg/errors"
|
||||
"github.com/sirupsen/logrus"
|
||||
)
|
||||
@@ -63,11 +64,34 @@ func (r *Runtime) migrate(ctx context.Context) error {
|
||||
}
|
||||
}
|
||||
|
||||
// Did the user request a new runtime?
|
||||
runtimeChangeRequested := r.migrateRuntime != ""
|
||||
requestedRuntime, runtimeExists := r.ociRuntimes[r.migrateRuntime]
|
||||
if !runtimeExists && runtimeChangeRequested {
|
||||
return errors.Wrapf(define.ErrInvalidArg, "change to runtime %q requested but no such runtime is defined", r.migrateRuntime)
|
||||
}
|
||||
|
||||
for _, ctr := range allCtrs {
|
||||
needsWrite := false
|
||||
|
||||
// Reset pause process location
|
||||
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")
|
||||
needsWrite = true
|
||||
}
|
||||
|
||||
// Reset runtime
|
||||
if runtimeChangeRequested {
|
||||
logrus.Infof("Resetting container %s runtime to runtime %s", ctr.ID(), r.migrateRuntime)
|
||||
ctr.config.OCIRuntime = r.migrateRuntime
|
||||
ctr.ociRuntime = requestedRuntime
|
||||
|
||||
needsWrite = true
|
||||
}
|
||||
|
||||
if needsWrite {
|
||||
if err := r.state.RewriteContainerConfig(ctr, ctr.config); err != nil {
|
||||
return errors.Wrapf(err, "error rewriting config for container %s", ctr.ID())
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user