Skip to content

Commit 8264686

Browse files
authored
Merge pull request #4862 from unsuman/fix/kill-port-reserver-on-stop
fix: free reserved ports in rootful mode
2 parents bae05c9 + e623dd5 commit 8264686

2 files changed

Lines changed: 25 additions & 9 deletions

File tree

pkg/cmd/container/stop.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ import (
2727
"github.com/containerd/nerdctl/v2/pkg/containerutil"
2828
"github.com/containerd/nerdctl/v2/pkg/healthcheck"
2929
"github.com/containerd/nerdctl/v2/pkg/idutil/containerwalker"
30+
"github.com/containerd/nerdctl/v2/pkg/ocihook"
3031
)
3132

3233
// Stop stops a list of containers specified by `reqs`.
@@ -50,6 +51,9 @@ func Stop(ctx context.Context, client *containerd.Client, reqs []string, opt typ
5051
}
5152
return err
5253
}
54+
if err := ocihook.CleanupPortReserverProcess(opt.GOptions.Namespace, found.Container.ID()); err != nil {
55+
return fmt.Errorf("unable to cleanup port reserver process for container: %s: %w", found.Req, err)
56+
}
5357
_, err := fmt.Fprintln(opt.Stdout, found.Req)
5458
return err
5559
},

pkg/ocihook/ocihook.go

Lines changed: 21 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -456,8 +456,24 @@ func reserveSocket(protocol, hostAddr string) (*os.File, error) {
456456
}
457457

458458
// portReserverPidFilePath returns /run/nerdctl/<namespace>/<id>/port-reserver.pid
459-
func portReserverPidFilePath(opts *handlerOpts) string {
460-
return filepath.Join("/run/nerdctl/", opts.state.Annotations[labels.Namespace], opts.state.ID, "port-reserver.pid")
459+
func portReserverPidFilePath(namespace, id string) string {
460+
return filepath.Join("/run/nerdctl/", namespace, id, "port-reserver.pid")
461+
}
462+
463+
func CleanupPortReserverProcess(namespace, id string) error {
464+
// In rootless mode, port-reserver is handled by Rootlesskit, so no cleanup is needed.
465+
if rootlessutil.IsRootlessChild() {
466+
return nil
467+
}
468+
469+
pidFile := portReserverPidFilePath(namespace, id)
470+
if err := killProcessByPidFile(pidFile); err != nil {
471+
return err
472+
}
473+
if err := os.RemoveAll(filepath.Dir(pidFile)); err != nil {
474+
log.L.WithError(err).Errorf("failed to remove the port-reserver directory %s", filepath.Dir(pidFile))
475+
}
476+
return nil
461477
}
462478

463479
func applyNetworkSettings(opts *handlerOpts) (err error) {
@@ -503,10 +519,10 @@ func applyNetworkSettings(opts *handlerOpts) (err error) {
503519
if err != nil {
504520
log.L.Debugf("killing the port reserver process (pid=%d)", reserverCmdPid)
505521
_ = reserverCmd.Process.Kill()
506-
_ = os.RemoveAll(filepath.Dir(portReserverPidFilePath(opts)))
522+
_ = os.RemoveAll(filepath.Dir(portReserverPidFilePath(opts.state.Annotations[labels.Namespace], opts.state.ID)))
507523
}
508524
}()
509-
if err := writePidFile(portReserverPidFilePath(opts), reserverCmdPid); err != nil {
525+
if err := writePidFile(portReserverPidFilePath(opts.state.Annotations[labels.Namespace], opts.state.ID), reserverCmdPid); err != nil {
510526
return fmt.Errorf("cannot write the pid file of the port reserver process: %w", err)
511527
}
512528
}
@@ -745,13 +761,9 @@ func onPostStop(opts *handlerOpts) error {
745761
return fmt.Errorf("failed to release container name %s: %w", name, err)
746762
}
747763
// Kill port-reserver process if any
748-
portReserverPidFile := portReserverPidFilePath(opts)
749-
if err = killProcessByPidFile(portReserverPidFile); err != nil {
764+
if err = CleanupPortReserverProcess(ns, opts.state.ID); err != nil {
750765
log.L.WithError(err).Errorf("failed to kill the port-reserver process")
751766
}
752-
if err := os.RemoveAll(filepath.Dir(portReserverPidFile)); err != nil {
753-
log.L.WithError(err).Errorf("failed to remove the port-reserver directory %s", filepath.Dir(portReserverPidFile))
754-
}
755767
return nil
756768
}
757769

0 commit comments

Comments
 (0)