mirror of
https://github.com/containers/podman.git
synced 2025-10-17 19:24:04 +08:00
Support checkpoint/restore with pods
This adds support to checkpoint containers out of pods and restore container into pods. It is only possible to restore a container into a pod if it has been checkpointed out of pod. It is also not possible to restore a non pod container into a pod. The main reason this does not work is the PID namespace. If a non pod container is being restored in a pod with a shared PID namespace, at least one process in the restored container uses PID 1 which is already in use by the infrastructure container. If someone tries to restore container from a pod with a shared PID namespace without a shared PID namespace it will also fail because the resulting PID namespace will not have a PID 1. Signed-off-by: Adrian Reber <areber@redhat.com>
This commit is contained in:

committed by
Adrian Reber

parent
3375cbb198
commit
eb94467780
@ -780,6 +780,16 @@ type ContainerCheckpointOptions struct {
|
||||
// Compression tells the API which compression to use for
|
||||
// the exported checkpoint archive.
|
||||
Compression archive.Compression
|
||||
// If Pod is set the container should be restored into the
|
||||
// given Pod. If Pod is empty it is a restore without a Pod.
|
||||
// Restoring a non Pod container into a Pod or a Pod container
|
||||
// without a Pod is theoretically possible, but will
|
||||
// probably not work if a PID namespace is shared.
|
||||
// A shared PID namespace means that a Pod container has PID 1
|
||||
// in the infrastructure container, but without the infrastructure
|
||||
// container no PID 1 will be in the namespace and that is not
|
||||
// possible.
|
||||
Pod string
|
||||
}
|
||||
|
||||
// Checkpoint checkpoints a container
|
||||
@ -811,7 +821,11 @@ func (c *Container) Checkpoint(ctx context.Context, options ContainerCheckpointO
|
||||
|
||||
// Restore restores a container
|
||||
func (c *Container) Restore(ctx context.Context, options ContainerCheckpointOptions) error {
|
||||
logrus.Debugf("Trying to restore container %s", c.ID())
|
||||
if options.Pod == "" {
|
||||
logrus.Debugf("Trying to restore container %s", c.ID())
|
||||
} else {
|
||||
logrus.Debugf("Trying to restore container %s into pod %s", c.ID(), options.Pod)
|
||||
}
|
||||
if !c.batched {
|
||||
c.lock.Lock()
|
||||
defer c.lock.Unlock()
|
||||
|
Reference in New Issue
Block a user