wait for docker container removal

This commit is contained in:
zyx 2020-06-03 19:47:14 +08:00
parent a8a35fc259
commit 85ce9c1270
2 changed files with 36 additions and 7 deletions

View File

@ -3,6 +3,9 @@ package worker
import ( import (
"fmt" "fmt"
"os" "os"
"time"
"github.com/codeskyblue/go-sh"
) )
type dockerHook struct { type dockerHook struct {
@ -60,6 +63,27 @@ func (d *dockerHook) postExec() error {
// sh.Command( // sh.Command(
// "docker", "rm", "-f", d.Name(), // "docker", "rm", "-f", d.Name(),
// ).Run() // ).Run()
name := d.Name()
retry := 10
for ; retry > 0; retry-- {
out, err := sh.Command(
"docker", "ps", "-a",
"--filter", "name=^"+name+"$",
"--format", "{{.Status}}",
).Output()
if err != nil {
logger.Errorf("docker ps failed: %v", err)
break
}
if len(out) == 0 {
break
}
logger.Debugf("container %s still exists: '%s'", name, string(out))
time.Sleep(1 * time.Second)
}
if retry == 0 {
logger.Warningf("container %s not removed automatically, next sync may fail", name)
}
d.provider.ExitContext() d.provider.ExitContext()
return nil return nil
} }

View File

@ -94,22 +94,27 @@ sleep 20
} }
exitedErr <- err exitedErr <- err
}() }()
cmdRun("ps", []string{"aux"})
// Wait for docker running // Wait for docker running
time.Sleep(8 * time.Second) for wait := 0; wait < 8; wait++ {
names, err := getDockerByName(d.Name())
cmdRun("ps", []string{"aux"}) So(err, ShouldBeNil)
if names != "" {
break
}
time.Sleep(1 * time.Second)
}
// cmdRun("ps", []string{"aux"})
// assert container running // assert container running
names, err := getDockerByName(d.Name()) names, err := getDockerByName(d.Name())
So(err, ShouldBeNil) So(err, ShouldBeNil)
// So(names, ShouldEqual, d.Name()+"\n") So(names, ShouldEqual, d.Name()+"\n")
err = provider.Terminate() err = provider.Terminate()
// So(err, ShouldBeNil) So(err, ShouldBeNil)
cmdRun("ps", []string{"aux"}) // cmdRun("ps", []string{"aux"})
<-exitedErr <-exitedErr
// container should be terminated and removed // container should be terminated and removed