github.com/apptainer/singularity@v3.1.1+incompatible/internal/pkg/runtime/engines/oci/cleanup.go (about) 1 // Copyright (c) 2018, Sylabs Inc. All rights reserved. 2 // This software is licensed under a 3-clause BSD license. Please consult the 3 // LICENSE.md file distributed with the sources of this project regarding your 4 // rights to use or distribute this software. 5 6 package oci 7 8 import ( 9 "fmt" 10 "os" 11 "syscall" 12 13 "github.com/sylabs/singularity/internal/pkg/instance" 14 "github.com/sylabs/singularity/internal/pkg/sylog" 15 "github.com/sylabs/singularity/pkg/ociruntime" 16 ) 17 18 // CleanupContainer cleans up the container 19 func (engine *EngineOperations) CleanupContainer(fatal error, status syscall.WaitStatus) error { 20 if engine.EngineConfig.Cgroups != nil { 21 engine.EngineConfig.Cgroups.Remove() 22 } 23 24 pidFile := engine.EngineConfig.GetPidFile() 25 if pidFile != "" { 26 os.Remove(pidFile) 27 } 28 29 // if container wasn't created, delete instance files 30 if engine.EngineConfig.State.Status == ociruntime.Creating { 31 name := engine.CommonConfig.ContainerID 32 file, err := instance.Get(name, instance.OciSubDir) 33 if err != nil { 34 sylog.Warningf("no instance files found for %s: %s", name, err) 35 return nil 36 } 37 if err := file.Delete(); err != nil { 38 sylog.Warningf("failed to delete instance files: %s", err) 39 } 40 return nil 41 } 42 43 exitCode := 0 44 desc := "" 45 46 if fatal != nil { 47 exitCode = 255 48 desc = fatal.Error() 49 } else if status.Signaled() { 50 s := status.Signal() 51 exitCode = int(s) + 128 52 desc = fmt.Sprintf("interrupted by signal %s", s.String()) 53 } else { 54 exitCode = status.ExitStatus() 55 desc = fmt.Sprintf("exited with code %d", status.ExitStatus()) 56 } 57 58 engine.EngineConfig.State.ExitCode = &exitCode 59 engine.EngineConfig.State.ExitDesc = desc 60 61 if err := engine.updateState(ociruntime.Stopped); err != nil { 62 return err 63 } 64 65 if engine.EngineConfig.State.AttachSocket != "" { 66 os.Remove(engine.EngineConfig.State.AttachSocket) 67 } 68 if engine.EngineConfig.State.ControlSocket != "" { 69 os.Remove(engine.EngineConfig.State.ControlSocket) 70 } 71 72 return nil 73 }