Bash 如果docker容器尚未运行,如何运行该容器
我只需要在docker容器尚未运行时运行它。有了这个命令。如果它不存在,我将如何运行它Bash 如果docker容器尚未运行,如何运行该容器,bash,docker,Bash,Docker,我只需要在docker容器尚未运行时运行它。有了这个命令。如果它不存在,我将如何运行它 docker run --name nginx -d nginx 我对任何脚本或语言都持开放态度。使用筛选器检查是否存在具有特定名称的容器: (见附件) 只有在第一部分为false时,才会执行docker运行 为了安全起见(docker ps可能会返回多个名称),您也可以这样做(如果您认为“nginx”一词不能作为任何容器名称的一部分): 或: 如果您对任何语言都持开放态度,我建议您使用docker com
docker run --name nginx -d nginx
我对任何脚本或语言都持开放态度。使用筛选器检查是否存在具有特定名称的容器:
(见附件) 只有在第一部分为false时,才会执行
docker运行
为了安全起见(docker ps
可能会返回多个名称),您也可以这样做(如果您认为“nginx”一词不能作为任何容器名称的一部分):
或:
如果您对任何语言都持开放态度,我建议您使用docker compose来完成此任务。安装后,创建一个名为docker-compose.yml的文件,其中包含以下内容:
version: '2'
services:
nginx:
image: 'nginx'
然后使用:
docker-compose up -d
它将始终检查容器是否已在运行。如果容器不存在,它将创建它并运行。如果容器停止运行,只需运行它
最好的办法是,如果您更改docker-compose.yml或拉取新版本的映像,它将自动重新创建容器,保留所有卷,即使是未命名的卷
关于我绝对建议调查docker compose和
docker compose,如上所述
由于您的问题是关于docker run,因此我会像这样简化VonC的答案
docker start nginx || docker run --name nginx -d nginx
如果容器已经在运行,docker start
将返回0
,因此不会执行docker run
。如果容器存在但未运行,docker start
将启动它,否则它将docker run
一次创建并启动它
VonC的答案中缺少“存在但已停止”部分。如果目的是幂等性,并且所讨论的容器是可替换的(如您的示例中所示),则系统的当前状态(是否正在运行)无关紧要 白纸黑字
$docker ps-a--格式{{.Names}}| wc-l
0
当容器存在时,执行强制删除和创建
$docker run--name=hello-d
0f6175804d69d48cdada66de57cb62c2855d1085c08a69f21e782c433be2c6a2
$docker ps--格式“{.Names}”
你好
$docker rm-f你好| |:
你好
$docker run--name=hello-d
...
和它没有的时候完全一样
$docker ps-a--格式{{.Names}}| wc-l
0
$docker rm-f hello 2>/dev/null | | |:
$docker run--name=hello-d
D0210FEFC7E934FEA669615538596CF372F15E9095EDAE81C35965FF021898
在执行条件检查时完全相同
$docker ps-a--格式{{.Names}
你好
$if!docker ps-a——格式“{.Names}}”| grep hello>/dev/null;然后
>docker run--name=hello-d
>fi
$docker rm-f你好
你好
$if!docker ps-a——格式“{.Names}}”| grep hello>/dev/null;然后
>docker run--name=hello-d
>fi
1edcbba0c01979edbe05072bd3c15b6ecfb129d9e20d45a33eff0921cc5f2ed3
这使得强制移除/创建一个幂等运算,而我们对状态的保证,post运算,使得条件句变得毫无意义和粗糙
如果您的容器必须观察某个底层状态,那么请忘记所有这些。如果使用不同的网络,情况似乎并非如此。我专门为我的CI服务器创建了一个网络,并使用别名运行了一个容器。我的撰写文件中引用了相同的容器/别名,它会抱怨冲突。网络是我唯一能做到的。因为“名称过滤器匹配所有或容器名称”,似乎是一个更可行的选项。@x-yuri
=$name
应该限制为容器名称。但是我同意,Eugen Mayer的回答也很好(并且被投了赞成票),但是docker ps-f name=…
可能会返回不止一个名称(nginx\ns1\u nginx…
或其他什么),所以如果docker ps--format'{.Names}}egrp'^nginx$'&>/dev/null;然后。。。;fi似乎是一个更安全的选项。@x-yuri是,或grep-w“nginx”
@x-yuri可以随意编辑答案并添加更安全的选项,顺便说一句:I(和任何其他读者)非常感谢:)您可能希望将start的stderr指向dev null,这样如果容器不存在,您就不会在脚本输出中收到大量错误文本,即docker start nginx 2>/dev/null | | docker run--name nginx-d nginx
version: '2'
services:
nginx:
image: 'nginx'
docker-compose up -d
docker start nginx || docker run --name nginx -d nginx