diff options
author | Matthew Heon <mheon@redhat.com> | 2019-02-11 12:57:08 -0500 |
---|---|---|
committer | Matthew Heon <mheon@redhat.com> | 2019-02-12 10:14:57 -0500 |
commit | b6775d5d22d463e4d92d6358ccd48dab6f8a1862 (patch) | |
tree | a0c0373125736b8b9bf59c93a794c7cadadd05c2 /utils | |
parent | bdf537f4fc983c30c945297d9ee33891a127f9bd (diff) | |
download | podman-b6775d5d22d463e4d92d6358ccd48dab6f8a1862.tar.gz podman-b6775d5d22d463e4d92d6358ccd48dab6f8a1862.tar.bz2 podman-b6775d5d22d463e4d92d6358ccd48dab6f8a1862.zip |
Fix manual detach from containers to not wait for exit
At present, when manually detaching from an attached container
(using the detach hotkeys, default C-p C-q), Podman will still
wait for the container to exit to obtain its exit code (so we can
set Podman's exit code to match). This is correct in the case
where attach finished because the container exited, but very
wrong for the manual detach case.
As a result of this, we can no longer guarantee that the cleanup
and --rm functions will fire at the end of 'podman run' - we may
be exiting before we get that far. Cleanup is easy enough - we
swap to unconditionally using the cleanup processes we've used
for detached and rootless containers all along. To duplicate --rm
we need to also teach 'podman cleanup' to optionally remove
containers instead of cleaning them up.
(There is an argument for just using 'podman rm' instead of
'podman cleanup --rm', but cleanup does have different semantics
given that we only ever expect it to run when the container has
just exited. I think it might be useful to keep the two separate
for things like 'podman events'...)
Signed-off-by: Matthew Heon <mheon@redhat.com>
Diffstat (limited to 'utils')
-rw-r--r-- | utils/utils.go | 12 |
1 files changed, 5 insertions, 7 deletions
diff --git a/utils/utils.go b/utils/utils.go index c7c5ab5cf..4a91b304f 100644 --- a/utils/utils.go +++ b/utils/utils.go @@ -9,6 +9,7 @@ import ( systemdDbus "github.com/coreos/go-systemd/dbus" "github.com/godbus/dbus" + "github.com/pkg/errors" ) // ExecCmd executes a command with args and returns its output as a string along @@ -82,12 +83,9 @@ func newProp(name string, units interface{}) systemdDbus.Property { } } -// DetachError is special error which returned in case of container detach. -type DetachError struct{} - -func (DetachError) Error() string { - return "detached from container" -} +// ErrDetach is an error indicating that the user manually detached from the +// container. +var ErrDetach = errors.New("detached from container") // CopyDetachable is similar to io.Copy but support a detach key sequence to break out. func CopyDetachable(dst io.Writer, src io.Reader, keys []byte) (written int64, err error) { @@ -108,7 +106,7 @@ func CopyDetachable(dst io.Writer, src io.Reader, keys []byte) (written int64, e } if i == len(keys)-1 { // src.Close() - return 0, DetachError{} + return 0, ErrDetach } nr, er = src.Read(buf) } |