mirror of
https://github.com/linuxkit/linuxkit.git
synced 2025-07-20 09:39:08 +00:00
Defer dockerRm until we are finished with the contents
This was introduced by #191 but somehow did not trigger either for me in local testing or in CI. It did trigger in initial CI of https://github.com/linuxkit/linuxkit/pull/2811 which can be seen at https://linuxkit.datakit.ci/linuxkit/linuxkit/pr/2811?history=1637690296123e9a15307b3a41b290da6e27e7cc The error is: Failed to docker rm container «...»: «...»: aufs: unmount error after retries: «...»: device or resource busy No doubt because we were still holding an open fd while trying to remove the container. Unclear why this didn't repro for me (docker 17.11.0-ce with overlay2) or whatever CI uses. Signed-off-by: Ian Campbell <ijc@docker.com>
This commit is contained in:
parent
ebd7228a44
commit
307f13b129
@ -82,7 +82,7 @@ func tarPrefix(path string, tw tarWriter) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// ImageTar takes a Docker image and outputs it to a tar stream
|
// ImageTar takes a Docker image and outputs it to a tar stream
|
||||||
func ImageTar(ref *reference.Spec, prefix string, tw tarWriter, trust bool, pull bool, resolv string) error {
|
func ImageTar(ref *reference.Spec, prefix string, tw tarWriter, trust bool, pull bool, resolv string) (e error) {
|
||||||
log.Debugf("image tar: %s %s", ref, prefix)
|
log.Debugf("image tar: %s %s", ref, prefix)
|
||||||
if prefix != "" && prefix[len(prefix)-1] != byte('/') {
|
if prefix != "" && prefix[len(prefix)-1] != byte('/') {
|
||||||
return fmt.Errorf("prefix does not end with /: %s", prefix)
|
return fmt.Errorf("prefix does not end with /: %s", prefix)
|
||||||
@ -119,12 +119,13 @@ func ImageTar(ref *reference.Spec, prefix string, tw tarWriter, trust bool, pull
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("Failed to docker export container from container %s: %v", container, err)
|
return fmt.Errorf("Failed to docker export container from container %s: %v", container, err)
|
||||||
}
|
}
|
||||||
defer contents.Close()
|
defer func() {
|
||||||
|
contents.Close()
|
||||||
|
|
||||||
err = dockerRm(container)
|
if err := dockerRm(container); e == nil && err != nil {
|
||||||
if err != nil {
|
e = fmt.Errorf("Failed to docker rm container %s: %v", container, err)
|
||||||
return fmt.Errorf("Failed to docker rm container %s: %v", container, err)
|
|
||||||
}
|
}
|
||||||
|
}()
|
||||||
|
|
||||||
// now we need to filter out some files from the resulting tar archive
|
// now we need to filter out some files from the resulting tar archive
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user