Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 如果docker容器尚未运行,如何运行该容器_Bash_Docker - Fatal编程技术网

Bash 如果docker容器尚未运行,如何运行该容器

Bash 如果docker容器尚未运行,如何运行该容器,bash,docker,Bash,Docker,我只需要在docker容器尚未运行时运行它。有了这个命令。如果它不存在,我将如何运行它 docker run --name nginx -d nginx 我对任何脚本或语言都持开放态度。使用筛选器检查是否存在具有特定名称的容器: (见附件) 只有在第一部分为false时,才会执行docker运行 为了安全起见(docker ps可能会返回多个名称),您也可以这样做(如果您认为“nginx”一词不能作为任何容器名称的一部分): 或: 如果您对任何语言都持开放态度,我建议您使用docker com

我只需要在docker容器尚未运行时运行它。有了这个命令。如果它不存在,我将如何运行它

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