diff --git a/libpod/container_internal.go b/libpod/container_internal.go index 97e6b47ba8..ca2eee1208 100644 --- a/libpod/container_internal.go +++ b/libpod/container_internal.go @@ -2674,7 +2674,12 @@ func (c *Container) update(resources *spec.LinuxResources, restartPolicy *string return fmt.Errorf("must provide restart policy if updating restart retries: %w", define.ErrInvalidArg) } - oldResources := c.config.Spec.Linux.Resources + oldResources := new(spec.LinuxResources) + if c.config.Spec.Linux.Resources != nil { + if err := JSONDeepCopy(c.config.Spec.Linux.Resources, oldResources); err != nil { + return err + } + } oldRestart := c.config.RestartPolicy oldRetries := c.config.RestartRetries @@ -2701,7 +2706,15 @@ func (c *Container) update(resources *spec.LinuxResources, restartPolicy *string if c.config.Spec.Linux == nil { c.config.Spec.Linux = new(spec.Linux) } - c.config.Spec.Linux.Resources = resources + + resourcesToUpdate, err := json.Marshal(resources) + if err != nil { + return err + } + if err := json.Unmarshal(resourcesToUpdate, c.config.Spec.Linux.Resources); err != nil { + return err + } + resources = c.config.Spec.Linux.Resources } if err := c.runtime.state.SafeRewriteContainerConfig(c, "", "", c.config); err != nil { diff --git a/test/system/280-update.bats b/test/system/280-update.bats index f4c8a9640a..451049ca5d 100644 --- a/test/system/280-update.bats +++ b/test/system/280-update.bats @@ -309,4 +309,21 @@ function nrand() { run_podman rm -t 0 -f $ctrname } + +# bats test_tags=ci:parallel +@test "podman update - resources on update are not changed unless requested" { + local ctrname="c-h-$(safename)" + run_podman run -d --name $ctrname \ + --pids-limit 1024 \ + $IMAGE /home/podman/pause + + run_podman update $ctrname --memory 100M + + # A Pid check is performed to ensure that other resource settings are not unset. https://github.com/containers/podman/issues/24610 + run_podman inspect $ctrname --format "{{.HostConfig.Memory}}\n{{.HostConfig.PidsLimit}}" + assert ${lines[0]} == "104857600" ".HostConfig.Memory" + assert ${lines[1]} == "1024" ".HostConfig.PidsLimit" + + run_podman rm -t 0 -f $ctrname +} # vim: filetype=sh