Docker创建网络应忽略现有网络

xzlaal3s  于 2022-11-22  发布在  Docker
关注(0)|答案(7)|浏览(197)

我的docker容器运行在一个本地网络中,称为my_local_network。为了确保网络存在,每个构建脚本都以如下内容开始:

docker network create --driver bridge my_local_network

这样可以正常工作。如果网络不存在,则会创建一个网络,如果不存在,则什么都不会发生。除了错误消息:

Error response from daemon: network with name my_local_network already exists

有没有办法告诉docker只在网络不存在的情况下创建网络?

w6mmgewl

w6mmgewl1#

根据@AndyTriggs的答案,一个简洁(正确)的解决方案是:

docker network inspect my_local_network >/dev/null 2>&1 || \
    docker network create --driver bridge my_local_network
cs7cruho

cs7cruho2#

目前没有办法强制或忽略它,但您可以使用shell -
docker network create --driver bridge my_local_network || true
这样,每当您的构建脚本执行时,如果没有网络,它将创建一个网络,它将返回true,而不会出现任何命令失败,以便可以执行构建脚本的其余部分。

1aaf6o9v

1aaf6o9v3#

您可以先测试网络是否存在,如果不存在则创建网络。例如:

docker network ls|grep my_local_network > /dev/null || echo "network does not exist"

将echo替换为您的network create命令:

docker network ls|grep my_local_network > /dev/null || docker network create --driver bridge my_local_network
zbsbpyhn

zbsbpyhn4#

你也可以这样做:

NETWORK_NAME=my_local_network
if [ -z $(docker network ls --filter name=^${NETWORK_NAME}$ --format="{{ .Name }}") ] ; then 
     docker network create ${NETWORK_NAME} ; 
fi

优点:

  1. Regexp可防止在现有网络具有类似名称的情况下忽略网络创建。
  2. Docker命令中的错误不会以静默方式传递。
    事实上,它与@Andy Triggs的答案下的评论中@yktoo提供的解决方案非常相似。
mzaanser

mzaanser5#

您可以像下面这样简单地使用grep,而不会打印出任何错误:

if [[ "$(docker network ls | grep "${networkName}")" != "" ]] ; then
    docker network rm "${networkName}"
fi

docker network create --subnet=172.10.0.0/16 "${networkName}"

在本例中,我假设已经创建的一个网络可以具有与我的不同的子网配置。
对于您的情况,将:

if [[ "$(docker network ls | grep "${networkName}")" == "" ]] ; then
    docker network create "${networkName}"
fi
yrefmtwq

yrefmtwq6#

如果您可以使用PowerShell

$networkName = "some name here"

if (docker network ls | select-string $networkName -Quiet )
{
    Write-Host "$networkName already created"
} else {
    docker network create $networkName
}

已在PS core 7.0.3上试用-此版本适用于Linux。

0aydgbwb

0aydgbwb7#

@wisniewski28的一个稍微简洁的版本回答:

if [[ ! $(docker network ls | grep "${networkName}") ]]; then
    docker network create "${networkName}"
fi

相关问题