我只有在尚未运行时才需要运行docker容器。鉴于此命令。如果它不存在,我将如何运行它。
docker run --name nginx -d nginx
我对任何脚本或语言都持开放态度。
答案 0 :(得分:30)
我肯定建议按照上面的回答查看docker-compose和docker-compose up
。
由于您的问题是关于docker run
,我会像这样简化VonC的答案
docker start nginx || docker run --name nginx -d nginx
如果容器已在运行,docker start
将返回0
,因此不会执行docker run
。如果容器EXISTS但未运行,docker start
将启动它,否则docker run
会创建它。
VonC的答案中缺少“存在但已停止”的部分。
答案 1 :(得分:14)
使用过滤器检查是否存在某个名称的容器:
(见docker ps Filterring)
#!/bin/bash
name='nginx'
[[ $(docker ps -f "name=$name" --format '{{.Names}}') == $name ]] ||
docker run --name nginx -d nginx
只有在第一部分为假时才会执行docker run
。
答案 2 :(得分:2)
如果您对任何语言持开放态度,我建议您使用docker-compose执行此任务。安装后,使用以下内容创建名为docker-compose.yml的文件:
version: '2'
services:
nginx:
image: 'nginx'
然后使用:
docker-compose up -d
它将始终检查容器是否已在运行。如果容器不存在,它将创建并运行。如果容器停止,它就运行它。
最好的办法是,如果你更改了docker-compose.yml或者拉了一个新版本的图像,它将自动重新创建容器,保留所有卷甚至是未命名的卷。
问候
答案 3 :(得分:1)
如果目的是幂等并且所讨论的容器是可互换的(例如您的示例),那么系统的当前状态(正在/正在运行)都无关紧要。
在空白板上。
$ docker ps -a --format '{{.Names}}' | wc -l
0
当容器存在时执行力移除并创建。
$ docker run --name=hello -d alpine sleep inf
0f6175804d69d48cdada66de57cb62c2855d1085c08a69f21e782c433be2c6a2
$ docker ps --format '{{.Names}}'
hello
$ docker rm -f hello ||:
hello
$ docker run --name=hello -d alpine sleep inf
...
与没有时完全相同。
$ docker ps -a --format '{{.Names}}' | wc -l
0
$ docker rm -f hello 2>/dev/null ||:
$ docker run --name=hello -d alpine sleep inf
d0210fefc7e934fea6d669615538596cf372f15e9095edae81c35965ff021898
执行条件检查时完全相同。
$ docker ps -a --format '{{.Names}}'
hello
$ if ! docker ps -a --format '{{.Names}}' | grep hello >/dev/null ;then
> docker run --name=hello -d alpine sleep inf
> fi
$ docker rm -f hello
hello
$ if ! docker ps -a --format '{{.Names}}' | grep hello >/dev/null ;then
> docker run --name=hello -d alpine sleep inf
> fi
1edcbba0c01979edbe05072bd3c15b6ecfb129d9e20d45a33eff0921cc5f2ed3
这使得强制删除/创建幂等操作,在这种情况下,我们对状态的保证,后期操作使条件句变得毫无意义和and琐。
如果您的容器必须观察某些基础状态,那么就把所有这些都忘了吧。