mirror of
https://github.com/containers/podman.git
synced 2025-06-22 01:48:54 +08:00
Merge pull request #15066 from sstosh/checkpoint-samename
Fix: Restore a container which name is equal to a image name
This commit is contained in:
@ -93,32 +93,49 @@ func init() {
|
||||
}
|
||||
|
||||
func restore(cmd *cobra.Command, args []string) error {
|
||||
var errs utils.OutputErrors
|
||||
var (
|
||||
e error
|
||||
errs utils.OutputErrors
|
||||
)
|
||||
podmanStart := time.Now()
|
||||
if rootless.IsRootless() {
|
||||
return fmt.Errorf("restoring a container requires root")
|
||||
}
|
||||
|
||||
// Find out if this is an image
|
||||
inspectOpts := entities.InspectOptions{}
|
||||
imgData, _, err := registry.ImageEngine().Inspect(context.Background(), args, inspectOpts)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
hostInfo, err := registry.ContainerEngine().Info(context.Background())
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
for i := range imgData {
|
||||
restoreOptions.CheckpointImage = true
|
||||
checkpointRuntimeName, found := imgData[i].Annotations[define.CheckpointAnnotationRuntimeName]
|
||||
if !found {
|
||||
return fmt.Errorf("image is not a checkpoint: %s", imgData[i].ID)
|
||||
// Check if the container exists (#15055)
|
||||
exists := &entities.BoolReport{Value: false}
|
||||
for _, ctr := range args {
|
||||
exists, e = registry.ContainerEngine().ContainerExists(registry.GetContext(), ctr, entities.ContainerExistsOptions{})
|
||||
if e != nil {
|
||||
return e
|
||||
}
|
||||
if hostInfo.Host.OCIRuntime.Name != checkpointRuntimeName {
|
||||
return fmt.Errorf("container image \"%s\" requires runtime: \"%s\"", imgData[i].ID, checkpointRuntimeName)
|
||||
if exists.Value {
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
if !exists.Value {
|
||||
// Find out if this is an image
|
||||
inspectOpts := entities.InspectOptions{}
|
||||
imgData, _, err := registry.ImageEngine().Inspect(context.Background(), args, inspectOpts)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
hostInfo, err := registry.ContainerEngine().Info(context.Background())
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
for i := range imgData {
|
||||
restoreOptions.CheckpointImage = true
|
||||
checkpointRuntimeName, found := imgData[i].Annotations[define.CheckpointAnnotationRuntimeName]
|
||||
if !found {
|
||||
return fmt.Errorf("image is not a checkpoint: %s", imgData[i].ID)
|
||||
}
|
||||
if hostInfo.Host.OCIRuntime.Name != checkpointRuntimeName {
|
||||
return fmt.Errorf("container image \"%s\" requires runtime: \"%s\"", imgData[i].ID, checkpointRuntimeName)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -223,6 +223,26 @@ var _ = Describe("Podman checkpoint", func() {
|
||||
Expect(result).Should(Exit(0))
|
||||
Expect(podmanTest.NumberOfContainersRunning()).To(Equal(1))
|
||||
Expect(podmanTest.GetContainerStatus()).To(ContainSubstring("Up"))
|
||||
|
||||
// Restore a container which name is equal to a image name (#15055)
|
||||
localRunString = getRunString([]string{"--name", "alpine", "quay.io/libpod/alpine:latest", "top"})
|
||||
session = podmanTest.Podman(localRunString)
|
||||
session.WaitWithDefaultTimeout()
|
||||
Expect(session).Should(Exit(0))
|
||||
|
||||
result = podmanTest.Podman([]string{"container", "checkpoint", "alpine"})
|
||||
result.WaitWithDefaultTimeout()
|
||||
|
||||
Expect(result).Should(Exit(0))
|
||||
Expect(podmanTest.NumberOfContainersRunning()).To(Equal(1))
|
||||
Expect(podmanTest.GetContainerStatus()).To(ContainSubstring("Exited"))
|
||||
|
||||
result = podmanTest.Podman([]string{"container", "restore", "alpine"})
|
||||
result.WaitWithDefaultTimeout()
|
||||
|
||||
Expect(result).Should(Exit(0))
|
||||
Expect(podmanTest.NumberOfContainersRunning()).To(Equal(2))
|
||||
Expect(podmanTest.GetContainerStatus()).To(ContainSubstring("Up"))
|
||||
})
|
||||
|
||||
It("podman pause a checkpointed container by id", func() {
|
||||
|
Reference in New Issue
Block a user