如何在docker覆盖网络创建过程中避免竞争条件?

如何在docker覆盖网络创建过程中避免竞争条件?,docker,docker-networking,Docker,Docker Networking,我有两台机器HostA和HostB,正确配置了领事和docker守护进程,以便使用docker network create-d overlay sharednet 我有一个TestScript.sh来检查网络是否存在,如果不存在,则创建网络。这个脚本在HostA和hosb上都可用。我还有一个MasterScript.sh,它只在一台机器上调用TestScript.sh。在我运行我的MasterScript.sh之后,我看到了一个令人惊讶的结果,两个同名的网络被创建了!!!这可能是docker守

我有两台机器HostA和HostB,正确配置了领事和docker守护进程,以便使用
docker network create-d overlay sharednet

我有一个
TestScript.sh
来检查网络是否存在,如果不存在,则创建网络。这个脚本在HostA和hosb上都可用。我还有一个
MasterScript.sh
,它只在一台机器上调用
TestScript.sh
。在我运行我的
MasterScript.sh
之后,我看到了一个令人惊讶的结果,两个同名的网络被创建了!!!这可能是docker守护进程同步问题

[HostA]# docker network ls
NETWORK ID          NAME                 DRIVER
ad492bba9efa        sharednet            overlay
ba53d4e7b739        sharednet            overlay

[HostB]# docker network ls
NETWORK ID          NAME                 DRIVER
ad492bba9efa        sharednet            overlay
ba53d4e7b739        sharednet            overlay
预期的行为是,当我在HostA上创建了一个网络
testnw
,然后在HostB上,我会看到类似这样的情况

[HostB]# docker network ls
68994f95cd67        testnw               overlay
[HostB]# docker network create -d overlay testnw
Error response from daemon: network with name testnw already exists

由于某些限制,我无法修改
MasterScript.sh
,但我可以修改
TestScript.sh
。所以问题是,我是否有可能在这个限制下解决这个竞态条件?

这个问题已经报告给Docker Github,目前正在进行跟踪

这个问题已经报告给Docker Github,目前正在进行跟踪

我完全同意你的期望;这看起来像个虫子。为什么首先要检查所有主机上的网络?在一台主机上做这件事还不够吗?@morxa在每台机器上我都有一份
TestScript.sh
管理本地docker容器的副本,并将它们连接到适当的网络。如果网络不存在,脚本将只创建网络并将容器附加到网络。由于
TestScript.sh
在本质上是完全分布式的,并且根据设计不能相互通信,因此主机A上的TestScript.sh不知道主机B上的TestScript.sh是否发出了create命令。因此,我必须依赖docker守护进程来同步我的网络创建命令。您使用的是哪个docker版本?@morxa docker 1.10.2我用脚本安装的,所以我认为这是最新的稳定版本,很有趣,现在我看到了同样的问题。你提交错误报告了吗?我完全同意你的期望;这看起来像个虫子。为什么首先要检查所有主机上的网络?在一台主机上做这件事还不够吗?@morxa在每台机器上我都有一份
TestScript.sh
管理本地docker容器的副本,并将它们连接到适当的网络。如果网络不存在,脚本将只创建网络并将容器附加到网络。由于
TestScript.sh
在本质上是完全分布式的,并且根据设计不能相互通信,因此主机A上的TestScript.sh不知道主机B上的TestScript.sh是否发出了create命令。因此,我必须依赖docker守护进程来同步我的网络创建命令。您使用的是哪个docker版本?@morxa docker 1.10.2我用脚本安装的,所以我认为这是最新的稳定版本,很有趣,现在我看到了同样的问题。你提交错误报告了吗?