我一直在研究一种解决方法,以便在启动容器的同时启动重复的容器,因此在第一个容器成功退出之前,它不应继续运行而是阻塞。为了达到这个目的,我使用了flock,但这对我当然没有帮助,它有时会起作用,即,一个容器获取了一个羊群,而另一个容器却被阻塞了,但是有时都同时获取了羊群并继续运行。我的用例是其他容器应等待其他容器成功退出。这是我正在使用的代码:
// Flock locks the jiva.lock file. If the file does not exist, it is
// created. If a new process is trying to access the same file it will
// return an error "resource temporarily unavailable".
func Flock(dir string) error {
logrus.Info("Take flock on jiva.lock file")
file, err := os.OpenFile(dir+"/jiva.lock", os.O_CREATE|os.O_RDWR, 0644)
if err != nil {
return err
}
// golang.org/x/sys/unix
err = unix.Flock(int(file.Fd()), unix.LOCK_EX|unix.LOCK_NB)
if err != nil {
file.Close()
return fmt.Errorf("Failed to flock, error: %v", err)
}
logrus.Infof("flock successful on file: %v", file.Name())
return nil
}
我正在使用绑定安装,以便文件jiva.lock
被两个容器共享。即使在这两种情况下,大多数情况下大部分时间我都直接在系统上和docker容器中直接运行二进制文件,这也不起作用。我也尝试使用strace对其进行调试,但这也表明两者都已成功获取了flock。任何帮助将不胜感激。