diff --git a/container/container.go b/container/container.go index 428309c..bb60c23 100644 --- a/container/container.go +++ b/container/container.go @@ -35,6 +35,8 @@ type ( // Container represents a container environment being prepared or run. // None of [Container] methods are safe for concurrent use. Container struct { + // Whether the container init should stay alive after its parent terminates. + AllowOrphan bool // Cgroup fd, nil to disable. Cgroup *int // ExtraFiles passed through to initial process in the container, @@ -252,8 +254,7 @@ func (p *Container) Start() error { } p.cmd.Dir = fhs.Root p.cmd.SysProcAttr = &SysProcAttr{ - Setsid: !p.RetainSession, - Pdeathsig: SIGKILL, + Setsid: !p.RetainSession, Cloneflags: CLONE_NEWUSER | CLONE_NEWPID | CLONE_NEWNS | CLONE_NEWIPC | CLONE_NEWUTS | CLONE_NEWCGROUP, @@ -268,6 +269,9 @@ func (p *Container) Start() error { UseCgroupFD: p.Cgroup != nil, } + if !p.AllowOrphan { + p.cmd.SysProcAttr.Pdeathsig = SIGKILL + } if p.cmd.SysProcAttr.UseCgroupFD { p.cmd.SysProcAttr.CgroupFD = *p.Cgroup }